繁体   English   中英

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

[英]Connection reset by peer: socket write error. What is wrong with my Java code

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

本地端口和服务器端口相同=8999。连接后,我必须向服务器发送消息: < STX >username=fred&password=abcd< ETX >

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

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");

注意:当连接到我能够接收和发送消息的机器上的虚拟服务器(本地主机)时,该程序可以成功运行。

请帮忙。

while (socket.isConnected()) {

问题在这里。

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

  2. isConnected()对于仍然存在的连接不是有效的测试。 唯一有效的测试是缺少IOException例如您正在获取的IOException ,这意味着对等方已关闭连接。 并且当您遇到此类异常时,您所能做的就是关闭套接字并停止尝试。 重试是没有意义的:连接已消失。

Socket.isConnected()仅告诉您有关套接字状态的信息 没有连接。 您已连接此插座,因此已连接。

注意:在套接字的生存期内,应使用相同的流,而不是为每条消息创建新的流。

@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();
}

但是我不知道为什么这段代码能正常工作,而原来的却行不通。 任何建议将不胜感激。 非常感谢您提供我的查询和重复的帖子。 :)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM