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

时间:2016-03-17 04:45:52

标签: java sockets tcp tcpdf socketexception

我正在尝试从独立的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");

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

请帮忙。

2 个答案:

答案 0 :(得分:0)

while (socket.isConnected()) {

问题出在这里。

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

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

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

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

答案 1 :(得分:-1)

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