java socket编程,如何告诉server流传输结束

FunnyRabbit 2011-09-17 04:56:20
我使用socket把一个xml文件发送到服务器,由服务器将数据流构造成xml文件后解析。
但是在客户端发完后,服务器因为无法判断已经传输完毕,所以一直停留在这句
String[] result=xml.extLogin(dis);
extLogin方法是我写的,进入后停留在构造xml Document对象上。
Document d=db.parse(is);

谁知道如何告诉服务器已经传输完毕,同时客户端又能接收服务器的响应数据????

代码如下
服务端的代码
DataInputStream dis =new DataInputStream(client.getInputStream());
String[] result=xml.extLogin(dis);
DataOutputStream dos = new DataOutputStream(client.getOutputStream());

if(UserList.userList.containsKey(result[0])){
if(((String)UserList.userList.get(result[0])).equals(result[1])){
dos.writeUTF("SUCCESS");
}else{
dos.writeUTF("密码错误!");
}
}else{
dos.writeUTF("用户名不存在!");
}


客户端代码:
DataInputStream data = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
DataOutputStream toClient = new DataOutputStream(client.getOutputStream());
DataInputStream fromServer=new DataInputStream(client.getInputStream());
//toClient.writeUTF("login");
//toClient.flush();
/*
* 传输文件
* */
int bufferSize = 1024;
byte[] buf = new byte[bufferSize];
while(true){
int read=0;
if(data!=null){
read=data.read(buf);
}
if(read==-1)
break;
toClient.write(buf,0,read);
}
toClient.flush();

/*
* 如果使用下面注释掉的两句中的任何一句
* server端能够收到结束符
* 解析xml
*
* 但是这里会抛出socket关闭异常
* 同时服务器也报Socket is closed
* 导致无法接收服务器返回的数据
*/
//client.getOutputStream().close();
//client.shutdownOutput();

/*
* 因为接收响应这段代码的存在
* 不使用client.getOutputStream().close();
* 或者client.shutdownOutput();
* 导致服务器无法判断已经传输完毕
* 卡在xml.extLogin(dis);这句上
*/
String resp=fromServer.readUTF();
...全文
494 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
潇水汀寒 2011-09-17
  • 打赏
  • 举报
回复
这样吧:

while(true){
int read=0;
if(data!=null){
read=data.read(buf);
}
if(read==-1){
byte[] buf2 = new byte[10];
for(int i=0;i<10;i++){

buf2[i]=★;
toClient.write(buf2,0,10);
}
break;
}
toClient.write(buf,0,read);
}
toClient.flush();
游一游走一走 2011-09-17
  • 打赏
  • 举报
回复
还是按一楼的来吧,报头传递内容的长度,不然你服务器处理会出现问题的,一般都是按一个固定的字节数组来处理的,比如后面只有10个字节,但你还是按1024个去读会出现问题的。。。就会出现失真的情况了,有相应的SOCKETSERVER框架可以很容易的构建服务器基于报文的结构
潇水汀寒 2011-09-17
  • 打赏
  • 举报
回复
文件流末尾增加判断常量字符:
  while(true){
int read=0;
if(data!=null){
read=data.read(buf);
}
if(read==-1){
byte[] buf2 = new byte[1025];
for(int i=0;i<1024;i++){
buf2[i]=buf[i];
buf2[i+1]=★;
}
break;
}
toClient.write(buf,0,read);
}
toClient.flush();

服务器端判断输入流末尾是不是有★;如果有,文件传输结束
淡定的峰哥 2011-09-17
  • 打赏
  • 举报
回复
一般socket通讯的时候报文分报文头和报文体,报文头的长度是固定的,报文头标示报文体的长度和其他内容,按照这个规则,无论是client还是server都可以按指定长度接收了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧