繁体   English   中英

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

[英]DataOutputStream.write(byte b[], int off, int len) don't throws exception

我使用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方法不会引发异常,而当连接丢失时,哪种send方法receive引发异常? 还有没有办法在类似于readFully方法的write方法中检查连接,例如抛出异常?

(很抱歉,如果我使用了错误的术语或语法,那么我正在学习英语。)

isConnected()方法没有告诉您连接的活跃性,仅告诉您套接字在某个时间点连接的。

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

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

如果要在发送消息之前确保另一端有东西,则可以通过向目标发送ping并在发送前确保另一端已连接东西来修改软件。

除了jtahlborn和Recursed的正确答案之外,您的消息可能甚至还没有离开JVM。 您正在写包裹在BufferedOutputStream.周围的DataOutputStream BufferedOutputStream. 除非您调用DataOutputStream.flush().否则什么都不会发生DataOutputStream.flush().

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM