我做了一个脚本来交换客户端和服务器之间的数据,在特定端口上有套接字。为了,我期待:
-
服务器正在侦听
-
客户端打开套接字
-
服务器通过发送一个 int -> 从未收到过!
我刚刚注意到我的客户端收到了 int,当我残酷地退出服务器时
这是我的(简单)代码。客户:
Socket socket = new Socket(SERVER_ADDR, PORT);
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
DataInputStream dIn = new DataInputStream(socket.getInputStream());
Log.v("[DEBUG]", "waiting aknowledgement");
status = dIn.readInt(); //<-- BLOCKS HERE
Log.v("[DEBUG]", "ack"); //<-- RECEIVED WHEN SERVER IS EXITED
服务器:
try {
DataInputStream stdIn = new DataInputStream(client.getInputStream());
DataOutputStream stdOut = new DataOutputStream(client.getOutputStream());
while (incoming) {
stdOut.writeInt(1);
stdOut.flush();
System.out.println("Waiting...");
var_from_client = stdIn.readInt(); //<-- BLOCKS HERE (BECAUSE CLIENT IS BLOCKED)
// ...
}
} catch (Exception e) {}
如何解释此错误?
"套接字不刷新数据"与它完全无关。这是由应用程序中的错误引起的死锁。
- 您的服务器发送一个 int。
- 您的客户会收到 int。
- 您的服务器阻止尝试读取另一个 int。
- 您的客户不发送 int。
- 服务器永远无法发送另一个 int,因为它被阻止等待不存在的回复 int。
- 您的客户端在尝试接收另一个 int 时阻塞,因为服务器被阻止发送它。
解决方案:从客户端发送 int。
笔记:
- 刷新套接字的输出流不执行任何操作,刷新直接包裹在其周围的
DataOutputStream
也不执行任何操作。 - 永远不要忽略异常。