robbin,问一个socket和io方面的问题

03-08-29 zmeng
我现在要从一台server通过tcp得到一个数据文件,server端给我传过来的数据内容是:
200 OK(表示有这个文件)
FILESIZE 1496124(数据文件的大小)
紧接着就是我要的到的数据文件

我的代码如下
public class getTar {

private FileWriter os = null;
/**
* set filename
* @param s
* @return
*/
public boolean setFilename(String s) {
try {
File f1 = new File(s);
if (f1.exists())
f1.delete();
os = new FileWriter(f1);
} catch (IOException e) {
return (false);
}
return (true);
}

/**
* get database file and save
* @param in
* @param FormSize
* @param os
*/
public void saveByte(InputStream in, int FormSize, FileWriter os) {
int i = 0;
DataInputStream is;
byte t;
try {
is = new DataInputStream(in);

while (i < FormSize) {
try {
t=is.readByte();
os.write(t);
i++; System.out.println("echo=" + i);
} catch (EOFException e) {
break;
}
}
is.close();
os.close();
} catch (IOException e) {
System.err.println("fault!");
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("fault!");
}
}
/**
* tar database and get database file
*
*/
public void getTar() {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
int FileSize = 0;

try {
echoSocket = new Socket("192.168.0.111", 2001);

out = new PrintWriter(echoSocket.getOutputStream(), true);
InputStream ist = echoSocket.getInputStream();
in = new BufferedReader(new InputStreamReader(ist));
String echooutput;
String getTar = "get 文件名";
out.println(getTar);
System.out.println(getTar);
int i = 0;
while (((echooutput = in.readLine()) != null) && i < 2) {
System.out.println("echo: " + echooutput);
if (i == 1) {
FileSize = Integer.parseInt(echooutput.substring(9));
System.out.println("echo: " + FileSize);
}
i++;
}

this.saveByte(ist, FileSize, os);

System.out.println("操作成功!");
out.close();
in.close();
echoSocket.close();
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (Exception e) {
System.err.println(
"Couldn't get I/O for " + "the connection to: taranis.");
System.exit(1);
}
}

public static void main(String[] args) {
getTar Tar1 = new getTar();

Tar1.setFilename("文件名");
Tar1.getTar();
}
}


我接受的文件大小是1496124
可是我的程序输出老是到echo=1481292或echo=1487139附近就停下了,我试好多次都是这样,帮忙看看是咋会事?

或者大概说一说java的io操作,我的理解java的io操作使用的是decorate模式,象接水管似的,imputstream(字节流)外面套一个InputStreamReader(具体的字符),但是有一个问题了,比如我想取字符用了InputStreamReader,然后我又想取字节了,怎麽办.用在imputstream取到的是不是我预期的字符后面的东西.
头疼死我了!

帮帮忙,多谢了

zmeng
2003-08-29 16:27
有人会吗?帮个忙,急用

robbin
2003-08-29 17:18
我搞不明白一个简简单单的读SocketOutputStream的程序怎么让你写的这么复杂,恨不得把Java IO API都用了遍了才甘心,就直接读SocketOutputStream不就得了?

zmeng
2003-08-29 20:17
robbin你有没有msn,这样向你请教起来方便,你的邮件好像不管用呀

robbin
2003-08-29 21:54
你这个程序要实现的功能很简单阿,就是构造一个SocketInputStream(我上面帖子敲错了),然后做个循环读数据就可以了,你把它再构造成BufferedReader虽然没有必要,但也可以,不过既然已经用Reader了,怎么还能再直接回头用Stream呢?我没有试过这样用可以不可以,感觉上Stream和Reader之间要进行字节和字符的转换,对于标记位运算可能会有不同。这种问题本来是个简单问题,何必非要绕个大弯尝试不确定的方式呢?

我有msn,但是从来都不用。

robbin
2003-08-29 23:02
我试了一下,把InputStream构造成BufferedReader并且使用之后,InputStream已经不能直接读出数据来了。你怎么还可能读得出数据?

zmeng
2003-08-29 23:05
不是我要这麽复杂,而是server(用unix c写的)就是这麽规定的,现在是我也能从server端接到数据,我都能看到文件在一点一点变大,可是就是快到完了的时候就停住了,因为server发送的数据结尾没有eof,所以连EOFEXception我都接不到.

我又作了一次试验,只用字节流来接数据,还是快到结束时,就停下来了.

确实,一个小小的socket取数据搞死我了,想想我也是一个比较自负的人,除了robbin的帖子,一般人我还都看不上.本身c/s结构的程序就是双方协商来编成的,可是那小子左一个java的原因右一个java的原因,气死我了,我现在就是想搞清楚问题不在我这里,然后再反馈给server,让他在修改,可是现在我没有证据呀.因为我以前主要不是搞socket编程的


zmeng
2003-08-29 23:08
多谢robbin,你有mail没有,我把我的代码发给你,你试试,我们的系统还在测试,所以server的ip不能贴出来

robbin
2003-08-29 23:34
我对Java Socket编程也不很熟,看起来你接收的字节也不过1MB多,既然你用字节流也取不到完整的数据,是不是可能需要调整一下Socket端口的属性?修改一下BufferSize,TimeOut之类的参数。我的Email地址一直都没有问题,可能因为设了一些关键字过滤垃圾邮件的缘故,中文主题的邮件不会被过滤的。