0

我正在做套接字编程。我有两个名为 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() 打开了连接,并且在我执行 isConnected() 的 catch 中发生异常之后。两次都只显示 True。

4

2 回答 2

1

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

于 2012-09-22T10:03:09.737 回答
1

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

谜题的另一部分是为什么isConnected()要返回true。这是由javadoc解释的,它说:

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

于 2012-09-22T11:29:24.353 回答