错误:java.net.SocketException: Connection reset

VirusFu 2011-04-26 04:12:22
客户端控制台提示错误:java.net.SocketException: Connection reset
感觉客户端代码,无法确定服务端文件何时传送结束,造成的错误原因:
while((in.read(data))!=-1){
out.write(data );
}




/**
*服务端
*/
public class Service2 {

public static void main(String[] args) {
InputStream in = null;
try{
ServerSocket service = new ServerSocket(8888);
Socket socket = service.accept();//阻塞
OutputStream out = socket.getOutputStream();
byte [] data = new byte[1024];
//开始读取文件
in = new FileInputStream("e:\\SNET.txt");

while (in.read(data)!=-1) {
out.write(data);
out.flush();
}

in.close();
System.out.println("传送文件结束...");
service.close();
System.out.println("服务器关闭");
} catch (IOException e) {
e.printStackTrace();
}
}

}

/**
* 客户端
*/
public class Client2 {
public static void main(String[] args) {
OutputStream out = null;
try {
Socket socket = new Socket("127.0.0.1",8888);
InputStream in = socket.getInputStream();
out = new FileOutputStream("e:\\123.txt");
byte[]data = new byte[1024];
int length = 0;
//这里出现的错误
while((in.read(data))!=-1){
out.write(data );
}
out.close();
System.out.println("文件接收结束...");
socket.close();
System.out.println("客户端结束");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}

...全文
424 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
VirusFu 2011-04-28
  • 打赏
  • 举报
回复
//*****************服务器端输出流必须关闭*****************//
out.close();
正确

ls能说说道理吗?
priestmoon 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 virusfu 的回复:]

//*****************服务器端输出流必须关闭*****************//
out.close();
正确

ls能说说道理吗?
[/Quote]


错误原因:
service.close()后服务器端关闭,但是服务器建立的socket连接没有关闭。客户端在读取时引发connection reset异常。

解决办法:
调用out.close()关闭服务器端输出流,这样socket连接也被关闭。客户端在读取时就不会引发异常了。
priestmoon 2011-04-26
  • 打赏
  • 举报
回复

/**
*服务端
*/
public class Service2 {

public static void main(String[] args) {
InputStream in = null;
try{
ServerSocket service = new ServerSocket(8888);
Socket socket = service.accept();//阻塞
OutputStream out = socket.getOutputStream();
byte [] data = new byte[1024];
//开始读取文件
in = new FileInputStream("e:\\SNET.txt");

while (in.read(data)!=-1) {
out.write(data);
out.flush();
}

in.close();
//*****************服务器端输出流必须关闭*****************//
out.close();
System.out.println("传送文件结束...");
service.close();
System.out.println("服务器关闭");
} catch (IOException e) {
e.printStackTrace();
}
}

}
小绵羊 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 virusfu 的回复:]

我也想到这了,如何解决这个问题,怎样判断服务器端传送文件结束或者服务端socket已关闭
[/Quote]
服务器写完数据后发送个标识什么的客户端接收到了就不读了
VirusFu 2011-04-26
  • 打赏
  • 举报
回复
我也想到这了,如何解决这个问题,怎样判断服务器端传送文件结束或者服务端socket已关闭
ethenjean 2011-04-26
  • 打赏
  • 举报
回复
什么错误,看代码没错的,文件应该能读取了。
唯一可能的错误就是服务端关闭了连接,而客户端却不知道,还在尝试读取而报出exception。
小绵羊 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 x19881216 的回复:]

System.out.println("传送文件结束...");
service.close();
System.out.println("服务器关闭");
服务端已经断开了,而客户端还在循环等待

//这里出现的错误
while((in.read(data))!=-1){//客……
[/Quote]

看错了。。。确实是服务端先关闭然后客户端还在读这样就会错
小绵羊 2011-04-26
  • 打赏
  • 举报
回复
System.out.println("传送文件结束...");
service.close();
System.out.println("服务器关闭");
服务端已经断开了,而客户端还在循环等待

//这里出现的错误
while((in.read(data))!=-1){//客户端永远停在这一步,in.read(data)会阻塞当前进程
out.write(data );
}
//这里不会执行
out.close();
System.out.println("文件接收结束...");
socket.close();
System.out.println("客户端结束");

62,614

社区成员

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

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