我有一个相当简单的多线程聊天程序,其中服务器从多个客户端接收数据,然后将消息中继回所有客户端。
虽然服务器确实正确接收了所有数据,但我似乎无法使客户端接收返回的值。
我已经阅读了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早已出问题了,但是我不确定那会是什么。
因此,客户不会收到消息,我不确定为什么。 运行该程序时,服务器会指示已找到所有客户端并已正确发送消息,但它们不会收到任何消息。
有什么想法吗?
答案 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)”。更改后,整个系统将按预期工作。