0

DataOutputStream用于向服务器发送/接收字节流。首先我讨论我的重要代码部分然后问我的问题。

我有一个发送方法如下:

protected static void sendMessage (Socket socket, byte[] b)  throws IOException
{
   BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream(), 2048);
   DataOutputStream serverOut = new DataOutputStream(bos);

   serverOut.write(b, 0, b.length);
   serverOut.flush();
}

我使用上述方法通过DataOutputStream实例向服务器发送消息。注意:Socket实例在之前初始化并作为参数发送到该方法;

另外我有一个receive方法如下:

protected static void receive (Socket socket, byte[] b) throws IOException
{ 
   BufferedInputStream bis = new BufferedInputStream (socket.getInputStream ());
   DataInputStream serverIn = new DataInputStream (bis);

   serverIn.readFully(b, 0, b.length);
}

在最后一步中,我展示了main方法:

public static void main(String[] args)
{
    ServerSocketFactory socket_factory = ServerSocketFactory.getDefault();
    InetAddress host =  InetAddress.getByName("192.168.20.33");
    ServerSocket server_socket = socket_factory.createServerSocket(1111,3,host);
    Socket socket = server_socket.accept();
    System.out.println(socket.isConnected());

    byte[] request = new byte[]{48,48,48};
    send(socket, request);

    byte[] response = new byte[10];
    receive(socket,response);
}

在正常情况下,一切都很好,但我的问题是:当服务器在通过socket.isConnected()语句send方法测试连接后关闭时工作正常并且任何异常都不会抛出,但是在调用receive方法时,它会为未连接的主机抛出异常。我很困惑,什么send方法在服务器失败时不会抛出异常,但receive在连接丢失时方法会抛出异常?还有没有办法在write方法类似的readFully方法中检查连接,对于示例它会引发异常?

(对不起,如果我使用了错误的术语或语法,我正在学习英语。)

4

3 回答 3

2

isConnected()方法没有告诉你连接的活跃度,只是套接字在某个时间点被连接。

有关处理断开连接的更多详细信息,请查看此答案

于 2012-07-02T12:39:42.897 回答
1

除了 jtahlborn 和 Recursed 的正确答案之外,您的消息可能还没有离开 JVM。你正在写一个DataOutputStream包裹在BufferedOutputStream.你打电话之前什么都不会发生的东西DataOutputStream.flush().

于 2012-07-03T01:13:58.090 回答
1

当您发送消息时,您的软件不知道目的地是否收到了您的消息。您可以将消息发送到任何位置,并且永远不会收到错误或异常。但是,当您收到一条消息时,您的软件完全知道它正在等待一条消息,并且当它没有按预期收到一条消息时会提醒您。

如果您想在发送消息之前确保另一端有东西,您可以通过向目的地发送 ping 来修改您的软件,并确保在发送之前在另一端连接了某些东西。

于 2012-07-02T12:40:29.313 回答