【问题标题】:Stream Write Exception流写入异常
【发布时间】:2012-09-14 12:03:52
【问题描述】:

我正在做套接字编程。我有两个名为 Server.java 和 client.java 的文件。两个程序都成功运行并成功地相互发送数据。昨天我在 client.java 文件中添加了以下几行:

     //old line
     out.writeUTF(dbdata); //dbdata was written successfully and sent to the server program
     try
     {
          //my socket connection object name is sock
            String data1="1000";
            System.out.println(data1);
            out.writeUTF(data1);   this line causes the error
     }

     catch(Exception e)
     {
            System.out.println("Exception :: "+e);
     }

当执行 out.writeUTF(data1) 行并 catch 捕获它并将异常显示为 BROKEN PIPE。

读取data1的server.java的内容如下:

     String data1;
     try
     {
            data1=in.readUTF();
     }
     catch(Exception e)
     {
            System.out.println("Server Exception :: "+e);
     }

我还检查了在 out.writeUTF(data1) 之前和在我执行 isConnected() 的 catch 中发生异常之后是否使用 isConnected() 打开了连接。两次都只显示 True。

【问题讨论】:

  • 异常是-----java.net.SocketException: Broken pipe
  • 试试这个有用的链接,别忘了打电话给out.flush()保存和out.close()stackoverflow.com/questions/1053467/…
  • isConnected() 不会告诉您连接是否仍然存在。它告诉你这个套接字是否曾经连接过。这不是一回事。

标签: java sockets io


【解决方案1】:

@EJP 是对的。异常意味着套接字在写调用完成之前关闭,并且可能在它开始之前关闭。无法知道有多少数据传送到了另一端。

谜题的另一部分是为什么isConnected() 会返回truejavadoc 解释了这一点:

"注意:关闭套接字不会清除其连接状态,这意味着如果在关闭之前成功连接,则此方法将为已关闭的套接字返回 true(参见 isClosed())。" em>

【讨论】:

    【解决方案2】:

    'Broken pipe' 表示您已写入已被另一端关闭的连接。换句话说,应用程序协议错误。缓解措施不是这样做,要么通过修复这一端使其不写入不需要的数据,要么修复另一端使其读取所有想要的数据。

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2016-12-28
      相关资源
      最近更新 更多