我写了一个简单的套接字程序,但服务器没有打印出任何东西。
客户:
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"?
这很可能是套接字缓冲区未被刷新,并且数据实际上并未发送到套接字;服务器在发送块之前正在等待更多数据。
如果我们查看PrintWriter
的文档:
。如果启用了自动刷新,则仅在调用 println、printf 或 format 方法之一时才会完成......
但是,您使用的是print
,而不是println
,因此刷新不是自动的。
尝试在写入数据后手动刷新流:
out.write(test);
out.flush();
是的,这是对一个 3 年前的帖子的回答...... 问题被编辑并弹出在我的流中
使用 telnet ( telnet localhost 9001
) 测试您的服务器显示它工作正常。我假设它一次只能打印一行而不是单个字符这一事实是预期的行为。
我确实发现了一个错误。终止 telnet 连接时,服务器将进入无限循环。我建议进行以下更改:
if (input!=null){
System.out.println(input);}
}
else {
break;
}
对于客户,我只需将write
替换为println
即可修复它:
out.println(test);