Java 套接字帮助调试



我写了一个简单的套接字程序,但服务器没有打印出任何东西。

客户:

        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);

最新更新