Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对等方重置连接:套接字写入错误。我的Java代码有什么问题_Java_Sockets_Tcp_Tcpdf_Socketexception - Fatal编程技术网

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

对等方重置连接:套接字写入错误。我的Java代码有什么问题,java,sockets,tcp,tcpdf,socketexception,Java,Sockets,Tcp,Tcpdf,Socketexception,我试图从一个独立的java应用程序创建并维护到主机的TCP连接 本地端口和服务器端口相同=8999。 连接后,我必须向服务器发送消息:用户名=fred&password=abcd 套接字创建和消息发送的代码如下所示: Socket socket = new Socket("mshxml.abcd.com", 8999, InetAddress.getLocalHost(), 8999); OutputStream outStream = socket.getOutputStream(); w

我试图从一个独立的java应用程序创建并维护到主机的TCP连接

本地端口和服务器端口相同=8999。 连接后,我必须向服务器发送消息:
用户名=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()) {
问题就在这里

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

  • isConnected()
    不是仍然存在的连接的有效测试。唯一有效的测试是不存在
    IOException
    ,例如您得到的异常,这意味着对等方已关闭连接。当您遇到这样的异常时,您所能做的就是关闭套接字并停止尝试。重试毫无意义:连接已断开

  • Socket.isConnected()
    只告诉您套接字的状态。没有连接。你连接了这个插座,所以它已连接

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

    问题就在这里

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

  • isConnected()
    不是仍然存在的连接的有效测试。唯一有效的测试是不存在
    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和下一行之间的连接的想法,您是对的。服务器没有立即关闭连接;只有在调试期间(当服务器有足够的时间分析字节时),我才注意到它正在这样做。

    @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和下一行之间的连接的想法,您是对的。服务器没有立即关闭连接;只有在调试期间(当服务器有足够的时间分析字节时),我才注意到它正在这样做。

    我删除了“while”和“Socket.isConnected()”行。我仍然在“dout.writeBytes”(“username=fred&password=abcd”);一行中遇到了相同的错误。基本上,每当我第二次尝试在“dataoutputstream”中写入时,我都会遇到这个错误。(如果我删除这一行,错误将出现在下一行,即当我写ETX时)@EJPIf这是真的,你对应用程序协议的想法是错误的。对等方甚至不认识STX。但我觉得这很难相信。在发送第二行之前,从发送STX到第二行之间没有足够的时间让对等方收到STX并关闭套接字,也没有足够的时间让您的主机收到关闭消息。您是否事先发送了其他无效的内容?我已删除“while”和“Socket.isConnected()”行。我仍然在“dout.writeBytes”(“username=fred&password=abcd”);一行中遇到了相同的错误。基本上,每当我第二次尝试在“dataoutputstream”中写入时,我都会遇到这个错误。(如果我删除这一行,错误将出现在下一行,即当我写ETX时)@EJPIf这是真的,你对应用程序协议的想法是错误的。对等方甚至不认识STX。但我觉得这很难相信。在发送第二行之前,从发送STX到第二行之间没有足够的时间让对等方收到STX并关闭套接字,也没有足够的时间让您的主机收到关闭消息。您是否事先发送了其他无效的内容?“本地端口和服务器端口相同=8999”为什么?“本地端口和服务器端口相同=8999”为什么?此代码不起作用。您不会让我相信服务器需要无限多的登录字符串,并且
    isConnected()
    测试仍然无效。您已更改了其他内容。while语句错误地添加到此处。更新了代码。现在你不会让我相信,一旦你删除了循环,原始版本中的
    DataOutputStream
    代码就不起作用了<代码>写入程序不适用于二进制数据。此代码不起作用。您不会让我相信服务器需要无限多的登录字符串,并且
    isConnected()
    测试仍然无效。你换了别的东西。而语句在这里被错误地添加了。更新了代码。现在是y