[英]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.