【问题标题】:BufferedReader not receiving message over socketBufferedReader 未通过套接字接收消息
【发布时间】:2012-01-05 05:50:46
【问题描述】:

情况是有 4 个“助手”线程,每个线程都与所有助手(包括其自身)连接。我确实在自动冲洗。下面,this.id 是一个 int,用于标识运行代码的助手。在调试中,我看到助手 0 向自己发送一条消息(通过所有连接发送),但是当它应该接收消息时(通过连接 0),它的行为就像它的 BufferedReader 有一个空缓冲区。

已解决:糟糕,我有一个设计缺陷。我确保每个助手只为每个助手保留一个需要与之通信的套接字,但是当助手连接到自己时这是不正确的。在这种情况下,只保留一个套接字意味着通信的另一个端点(与自身)丢失。

我的程序在这里永远旋转(必须是空缓冲区):

        boolean clientStreamReady = false;
        boolean helperStreamReady = false;
        while (!(clientStreamReady || helperStreamReady)) {
            clientStreamReady = this.inFromClient.ready();
            helperStreamReady = this.helperIns.get(this.id).ready();

            if (clientStreamReady) {
                message = this.inFromClient.readLine();
            }
            else if (helperStreamReady){
                message = this.helperIns.get(this.id).readLine();
            }
        }

消息在这里“广播”:

    for (PrintWriter out : this.helperOuts) {
        out.println(this.id + "," + kind + "," + this.clock.getTime());
    }

在上述设置之前,来自套接字的 IO 在这里完成:

    for (Socket socket : this.helperSockets) {
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            this.helperOuts.add(out);
            this.helperIns.add(in);
    }

如果需要套接字设置代码,请告诉我,我会添加它。

【问题讨论】:

    标签: java sockets io


    【解决方案1】:

    您的 PrintWriter 是否启用了自动刷新?如果没有,广播循环结束时的一个简单的 out.flush() 可能已经解决了问题。

    【讨论】:

    • 是的,我愿意。不过建议很好,之前没有设置自动刷新让我有过几次。
    猜你喜欢
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多