Java套接字帮助调试

时间:2015-04-16 02:11:41

标签: java sockets serversocket

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

客户端:

        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”?

2 个答案:

答案 0 :(得分:0)

使用telnet(telnet localhost 9001)测试您的服务器,发现它运行正常。我认为,它一次只能打印一行,而不是单个字符,这是预期的行为。

我确实发现了一个错误。终止telnet连接时,服务器将进入无限循环。我建议做出以下改变:

if (input!=null){
    System.out.println(input);}
}
else {
    break;
}

对于客户,我只需将write替换为println即可解决问题:

out.println(test);

答案 1 :(得分:0)

很有可能套接字缓冲区没有被刷新,并且数据实际上没有发送到套接字;服务器在发送块之前正在等待更多数据。

如果我们查看PrintWriter的文档:

  

...如果启用了自动刷新,则只有在调用println,printf或format方法之一时才会执行...

但是,您使用的是print,而不是println,因此刷新不是自动的。

尝试在写入数据后手动刷新流:

out.write(test);
out.flush();

是的,这是对3岁帖子的答案...问题已被编辑并在我的信息流中弹出