Java-客户赢得';尽管服务器从客户端接收数据,但无法从服务器接收数据
我有一个相当简单的多线程聊天程序,其中一个服务器从多个客户端接收数据,然后将消息转发回所有客户端 虽然服务器确实正确地接收了所有数据,但我似乎无法让客户端接收返回的值 我已经阅读了StackOverflow和其他论坛的大量代码和建议,但我似乎找不到问题所在 ServerThread具有PrintWriter“out”,声明和抓取如下内容:Java-客户赢得';尽管服务器从客户端接收数据,但无法从服务器接收数据,java,sockets,printwriter,Java,Sockets,Printwriter,我有一个相当简单的多线程聊天程序,其中一个服务器从多个客户端接收数据,然后将消息转发回所有客户端 虽然服务器确实正确地接收了所有数据,但我似乎无法让客户端接收返回的值 我已经阅读了StackOverflow和其他论坛的大量代码和建议,但我似乎找不到问题所在 ServerThread具有PrintWriter“out”,声明和抓取如下内容: private PrintWriter out; public PrintWriter getWriter(){ return 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,但这似乎也不起作用,因为程序在启动时仍然冻结。我会把它弄得更糟一点,看看是否有其他组合可以解决问题。