我写了一个简单的套接字程序,但服务器没有打印出任何东西。
客户:
public class ChatClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 9001);
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
Scanner reader = new Scanner(System.in);
while (true) {
String test = reader.next();
out.write(test);
System.out.println(test);
//String line = in.readLine();
}
}
}
服务器:
public class ServerApplication {
private static final int PORT = 9001;
private static HashSet<String> names = new HashSet<String>();
private static HashSet<PrintWriter> writers = new HashSet<PrintWriter>();
public static void main(String[] args) throws Exception {
ServerSocket listener = new ServerSocket(PORT);
try {
while (true) {
System.out.println("Server starts!");
new ChatThread(listener.accept()).start();
}
} finally {
}
}
}
public class ChatThread extends Thread{
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public ChatThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
System.out.println("Thread Starts!");
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
while(true){
System.out.println("Getting input!");
String input = in.readLine();
System.out.println("test");
if (input!=null){
//out.print(input);
System.out.println(input);}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
任何想法如何解决这个问题所以当我在客户端输入“Hello”时,服务器将使用system.out.println()打印出“Hello”?
使用telnet(telnet localhost 9001
)测试你的服务器后发现它运行正常。我认为它一次只能打印一行而不是单个字符的事实是预期的行为。
我找到了一个bug。终止telnet连接时,服务器将进入无限循环。我建议进行以下更改:
if (input!=null){
System.out.println(input);}
}
else {
break;
}
对于客户端,我只需将write
替换为println
即可解决问题:
out.println(test);
这很可能是套接字缓冲区没有被刷新而且数据实际上没有被发送到套接字;服务器在发送块之前等待更多数据。
如果我们查看PrintWriter
的文档:
...如果启用了自动刷新,则仅在调用println,printf或format方法之一时才会执行...
但是,你使用的是print
,而不是println
,所以冲洗不是自动的。
尝试在写入数据后手动刷新流:
out.write(test);
out.flush();
是的,这是一个3岁的帖子的答案...问题被编辑并弹出我的流