【问题标题】:Java - Clients won't receive data from server despite server receiving data from clientsJava - 尽管服务器从客户端接收数据,但客户端不会从服务器接收数据
【发布时间】:2019-05-21 18:44:21
【问题描述】:

我有一个相当简单的多线程聊天程序,其中服务器从多个客户端接收数据,然后应该将消息转发回所有客户端。

虽然服务器确实正确接收了所有数据,但我似乎无法让客户端接收返回值。

我已经阅读了大量来自 StackOverflow 和其他论坛的代码和建议,但我似乎找不到问题。

ServerThread 有 PrintWriter “out”,这样声明和抓取:

private PrintWriter out;

public PrintWriter getWriter(){
        return out;
    }

public void run() {
        try{
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader (new InputStreamReader(socket.getInputStream()));

ServerThread 中的这个方法应该传递数据:

if(input != null){
                    //Loggs message to file:
                    loggMessage(input);
                    //Loggs message to Server GUI
                    setOutput(input);
                    //Prints message to Output
                    System.out.println(input);
                    //Sends message to other clients:
                    for(ServerThread c : UserList){
                        System.out.println("Client discovered");
                        PrintWriter clientwriter = c.getWriter();
                        clientwriter.write(input);
                        System.out.print(input + " <-- was written to client");
                    }
                }

控制台(和文件)按预期获取所有消息,但客户端没有。据我所知,这要么是由于这批代码中的那一行有问题,要么是客户端有问题

客户端:

in = new BufferedReader (new InputStreamReader(socket.getInputStream()));

“in”是这样声明的,在以下代码块之前的几行:

if(in.ready()){
                    String serverin = in.readLine();
                    System.out.println(serverin);
                    setOutput(serverin);
                }

这个 system.out.print 不打印任何东西。这让我相信 if 中已经出现了问题,但我不确定那会是什么。

所以,客户端不会收到消息,我不知道为什么。 当程序运行时,服务器指示已找到所有客户端并适当地发送消息,但它们不会收到任何信息。

有什么想法吗?

【问题讨论】:

    标签: java sockets printwriter


    【解决方案1】:

    我认为对 in.ready() 的调用是错误的。

    if(in.ready()){
                        String serverin = in.readLine();
                        System.out.println(serverin);
                        setOutput(serverin);
                    }
    

    没有必要调用 ready() 因为 in.readline() 会等待(阻塞)直到有输入。

    另一个问题是 readline() 将等待(阻塞),直到服务器发送换行符,并且只有在收到换行符后才返回字符串,所以您确定输​​入包含换行符吗?

    【讨论】:

    • 虽然我认为您可能是对的,但我不确定应该用什么替换它们。通过删除 if(in.ready()) 我确定问题可能是由 readLine 引起的,因为程序在没有 if 子句的情况下运行时从未超过此行。对我来说,这表明 if 子句之前从未真正触发过,这意味着它确实应该已经消失,但 readLine() 应该被其他东西替换。 in.read() 只返回和 int,所以也不完全是这样。
    • 首先:在服务器上尝试将“\r\n”添加到您发送给客户端的内容中。然后 readline 可能会返回一整行文本。 Read 一次读取一个字节,如果连接关闭则返回 -1。因此,如果 readline 仍然不起作用,请尝试如果不起作用,请尝试将客户端上的 readline() 替换为: while(true) { int val=in.read(); System.out.println(val);如果(val==-1)中断; }
    • 通过删除 if 子句,程序现在在尝试解释“输入”字符串时立即崩溃,因为程序启动时它为空。我试图通过用一个新的 if 子句包围它来解决这个问题,以便它只在 in.read() != -1 时读取,但这似乎也不起作用,因为程序在启动时仍然冻结。我会再搞砸一点,看看是否有其他组合可以解决。
    【解决方案2】:

    所以,经过大量的测试和对比代码,我终于找到了问题所在。

    “clientwriter.write(input)”应该是“clientwriter.println(input)”。更改后,整个系统按预期工作。

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多