通过对等方重置连接:套接字写入错误。 我的Java代码有什么问题

我试图从独立的Java应用程序创建和维护到主机的TCP连接。

本地端口和服务器端口相同= 8999.连接后,我必须向服务器发送一个消息: username=fred&password=abcd

套接字创建和消息发送的代码如下:

 Socket socket = new Socket("mshxml.abcd.com", 8999, InetAddress.getLocalHost(), 8999); OutputStream outStream = socket.getOutputStream(); while (socket.isConnected()) { try { int stx = 2, etx = 3; DataOutputStream dout = new DataOutputStream(outStream); dout.writeByte(stx); dout.writeBytes("username=fred&password=abcd"); dout.writeByte(etx); } catch (Exception e) { e.printStackTrace(); } 

但这种联系并不存在。 在调试时,我发现以下错误:

 java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(Unknown Source) at java.net.SocketOutputStream.write(Unknown Source) at java.io.DataOutputStream.writeBytes(Unknown Source) at com.voya.socketprog.CClient.createConnection(CClient.java:120) at com.voya.socketprog.CClient.createSocket(CClient.java:33) at com.voya.socketprog.CClient.main(CClient.java:138) Line 120 is: dout.writeBytes("username=fred&password=abcd"); 

注意:当我连接到我的机器上的虚拟服务器(localhost)时,同样的程序可以成功运行,我可以接收和发送消息。

请帮忙。

 while (socket.isConnected()) { 

问题出在这里。

  1. 首先没有理由使用while循环。 这是一条登录消息:它只需要发送一次。 服务器几乎肯定不会期望从登录连接中获得第二个,因此它正在关闭。

  2. isConnected()不是仍然存在的连接的有效测试。 唯一有效的测试是没有IOException例如您正在获得的IOException ,这意味着对等方已关闭连接。 当你得到这样的例外时,你所能做的只是关闭套接字并停止尝试。 重试毫无意义:连接已经消失。

Socket.isConnected()只告诉你Socket的状态 不是连接。 您已连接此套接字,因此已连接。

注意您应该在套接字的生命周期中使用相同的流,而不是为每个消息创建一个新的流。

@EJP @weston这个问题在经过多次打击和试用后得到了解决。 工作代码如下:

 Socket socket = new Socket("mshxml.abcd.com", 8999, InetAddress.getLocalHost(), 8999); OutputStream outStream = socket.getOutputStream(); try { String STX = new Character((char) 2).toString(); String ETX = new Character((char) 3).toString(); OutputStreamWriter osw = new OutputStreamWriter(outStream); BufferedWriter bw = new BufferedWriter(osw); bw.write( STX + "username=fred&password=abcd" + ETX ); bw.flush(); } catch (Exception e) { e.printStackTrace(); } 

但我不知道为什么这个代码工作而原始代码不工作。 任何建议将不胜感激。 非常感谢您提出我的疑问和重复的post。 🙂

@EJP关于你关于服务器关闭接收STX和下一行之间的连接的想法,你是对的。 服务器没有立即关闭连接; 它只是在调试期间(当服务器有足够的时间来分析字节时),我注意到它正在这样做。