DataOutputStream.write(byte b [],int off,int len)不会抛出异常

时间:2012-07-02 12:32:58

标签: java io client-server java-io

我使用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方法的连接,对于它会抛出异常的样本吗?

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

3 个答案:

答案 0 :(得分:2)

isConnected()方法告诉您关于连接活跃性的任何信息,只是在一个时间点连接套接字

有关处理断开连接的更多详细信息,请查看this answer

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

除了jtahlborn和Recursed的正确答案之外,你的消息可能还没有离开JVM。您正在写DataOutputStream缠绕BufferedOutputStream.在您致电DataOutputStream.flush().

之前,什么都不会发生