Java-即使服务器从客户端接收数据,客户端也不会从服务器接收数据

时间:2019-05-21 18:44:21

标签: java sockets printwriter

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

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

我已经阅读了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早已出问题了,但是我不确定那会是什么。

因此,客户不会收到消息,我不确定为什么。 运行该程序时,服务器会指示已找到所有客户端并已正确发送消息,但它们不会收到任何消息。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

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

不需要调用ready(),因为in.readline()将等待(阻止)直到输入。

另一个问题是readline()将等待(阻止)服务器发送换行符,并且仅在获得换行符后才返回字符串,因此您确定输入包含换行符吗?

答案 1 :(得分:0)

因此,经过大量的测试和比较代码后,我终于找到了问题。

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