套接字没有刷新数据

时间:2017-01-10 21:50:15

标签: android sockets datainputstream dataoutputstream

我做了一个脚本,在客户端和服务器之间使用特定端口上的套接字交换数据。 按顺序,我期待:

  • 服务器正在侦听

  • 客户端打开套接字

  • 通过发送一个int - >服务器akwnoledges从未收到过!

我刚注意到我的客户端收到了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) {}

如何解释此错误?

1 个答案:

答案 0 :(得分:0)

'套接字没有刷新数据'与它完全无关。这是由应用程序中的错误引起的死锁,

  1. 您的服务器发送一个int。
  2. 您的客户收到了int。
  3. 您的服务器阻止尝试读取另一个int。
  4. 您的客户端不发送int。
  5. 服务器永远不会发送另一个int,因为它被阻塞,等待不存在的回复int。
  6. 您的客户端在尝试接收另一个int时会阻塞,因为服务器无法发送它。
  7. 解决方案:从客户端发送int。

    注意:

    1. 刷新套接字的输出流什么都不做,也没有冲洗DataOutputStream直接包裹它。
    2. 从不忽略例外。