Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-客户赢得';尽管服务器从客户端接收数据,但无法从服务器接收数据_Java_Sockets_Printwriter - Fatal编程技术网

Java-客户赢得';尽管服务器从客户端接收数据,但无法从服务器接收数据

Java-客户赢得';尽管服务器从客户端接收数据,但无法从服务器接收数据,java,sockets,printwriter,Java,Sockets,Printwriter,我有一个相当简单的多线程聊天程序,其中一个服务器从多个客户端接收数据,然后将消息转发回所有客户端 虽然服务器确实正确地接收了所有数据,但我似乎无法让客户端接收返回的值 我已经阅读了StackOverflow和其他论坛的大量代码和建议,但我似乎找不到问题所在 ServerThread具有PrintWriter“out”,声明和抓取如下内容: private PrintWriter out; public PrintWriter getWriter(){ return out;

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

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

我已经阅读了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”是这样声明的,位于以下代码块的前几行:

if(in.ready()){
                    String serverin = in.readLine();
                    System.out.println(serverin);
                    setOutput(serverin);
                }
此system.out.print不打印任何内容。这让我相信if已经出了问题,但我不确定那会是什么

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


有什么想法吗?

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

if(in.ready()){
                    String serverin = in.readLine();
                    System.out.println(serverin);
                    setOutput(serverin);
                }
不需要调用ready(),因为in.readline()将等待(阻塞)直到有输入


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

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

if(in.ready()){
                    String serverin = in.readLine();
                    System.out.println(serverin);
                    setOutput(serverin);
                }
不需要调用ready(),因为in.readline()将等待(阻塞)直到有输入


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

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


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

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


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

虽然我认为您可能是对的,但我不确定应该用什么来替换它们。通过删除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);if(val=-1)break;}通过删除if子句,程序现在在尝试解释“input”字符串时立即崩溃,因为程序启动时该字符串为null。我试图用一个新的if子句来解决这个问题,这样它只在in.read()时读取-1,但这似乎也不起作用,因为程序在启动时仍然冻结。我会把事情弄得更糟一点,看看是否有其他组合可以解决问题。虽然我认为你可能是对的,但我不确定应该用什么来取代它们。通过删除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);if(val=-1)break;}通过删除if子句,程序现在在尝试解释“input”字符串时立即崩溃,因为程序启动时该字符串为null。我试图用一个新的if子句来解决这个问题,这样它只在in.read()时读取-1,但这似乎也不起作用,因为程序在启动时仍然冻结。我会把它弄得更糟一点,看看是否有其他组合可以解决问题。