java socket 通信 connection reset问题

QQ5185149 2008-04-03 03:31:37
客户端(java)读取服务器端(C++)的数据,只能读取服务器端一次写入到流中的数据,在read就抛java.net.SocketException: Connection reset的错误,已经折磨我很长时间了,本人对C++不太了解,而且C++开发的客户端是正常的,所以我觉得我的代码肯定有问题,希望高人指点
客户端代码:
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
socket = new Socket(SocketConfig.SERVER_IP, SocketConfig.SERVER_PORT);
socket.setSoTimeout(10000);
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), SocketConfig.CHAR_ENCODING));

out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), SocketConfig.CHAR_ENCODING), true);


String cmd = SocketClient.genCmd(command);
System.out.println("command:::" + cmd);
out.println(cmd);
out.flush();

char[] head_char = new char[18];
in.read(head_char);
String head = new String(head_char);

//输出到控制台
System.out.print("resHead:::");
System.out.println(head);

char state = head.charAt(0);// 结果状态
char encryptType = head.charAt(1);//加密方式
int rows = Integer.parseInt(head.substring(2, 6));// 结果行数
int cols = Integer.parseInt(head.substring(6, 10));// 每行字段数
long byteCounts = Long.parseLong(head.substring(10, 18));// 结果字节数
String resultBuf = "";// 结果内容

//逐行读取结果内容
for(int i = 0; i < rows; i++){
String oneRow = in.readLine();
System.out.println(oneRow);
}

} catch (Exception e) {
e.printStackTrace();
throw new Exception(e);

} finally {
try {
if (null != out)
out.close();
if (null != in)
in.close();
if (null != socket)
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}

错误信息:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.read(BufferedReader.java:157)
at com.rails.smm.cmd.SocketClient.execCmd(SocketClient.java:87)
at com.rails.smm.cmd.SocketClient.main(SocketClient.java:163)
...全文
464 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在 Java 网络编程中,SocketException 是一种频繁出现的异常,其中 Connection reset by peer 是比较特殊的一种。当客户端与服务器端之间的连接被中断,而连接的一端还在尝试发送数据时,就会出现 Connection reset by peer 异常。该异常产生的原因主要有两个方面:一是连接的一端的 Socket 被关闭,无论是主动关闭还是因异常退出导致的关闭,另一端若继续发送数据,发送的第一个数据包就会触发该异常;二是连接的一端退出时未正确关闭连接,此时另一端若从该连接中读取数据,就会抛出该异常。 针对 Connection reset by peer 异常,有多种解决办法。首先,可以设置 Socket 的 timeout 时间,这样可以防止在连接断开后,继续进行读写操作而引发异常。其次,要确保在连接关闭之后,另一端不会再发送数据。此外,还可以采用连接池等机制来管理连接,以此来减少连接的频繁创建和关闭,从而降低出现该异常的可能性。 在相关知识点方面,Socket 是网络编程的基础概念,它使得不同计算机之间能够进行通信。在 Java 中,Socket 是一个类,提供了创建连接以及发送、接收数据的方法。SocketException 是 Java 中的一种异常,主要发生在 Socket 编程过程中,比如连接断开、数据发送失败等情况。而 Connection reset by peer 则是 SocketException 中的一种特殊情况,其发生场景如前文所述。 从实践经验来看,Connection reset by peer 异常有时可能是由 timer 的方法引起的。在一些场景下,timer 的方法可能会频繁地建立和关闭大量的 Socket 连接,

62,635

社区成员

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

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