【问题标题】:Socket not flushing data套接字不刷新数据
【发布时间】:2017-01-10 21:50:14
【问题描述】:

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

  • 服务器正在监听

  • 客户端打开一个套接字

  • 服务器通过发送 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) {}

如何解释这个错误?

【问题讨论】:

    标签: android sockets datainputstream dataoutputstream


    【解决方案1】:

    'Socket not flushing data' 与此完全无关。这是一个死锁,是由您的应用程序中的错误引起的。

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

    解决方案:从客户端发送 int。

    注意事项:

    1. 刷新套接字的输出流没有任何作用,刷新直接包裹在它周围的DataOutputStream 也没有。
    2. 从不忽略异常。

    【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多