【问题标题】:Java socket help debuggingJava socket 帮助调试
【发布时间】:2018-09-05 13:55:53
【问题描述】:

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

客户:

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

【问题讨论】:

  • 你得到了什么输出?
  • 我没有得到任何输出。我只得到:服务器启动!服务器启动!话题开始!获得输入! (之后就没有了!)
  • 你是在服务器之后启动客户端吗?
  • 会不会是防火墙?
  • 在客户端,写完之后,按照@ScaryWombat的建议,out.write("\r\n")。然后调用 out.flush()

标签: java sockets serversocket


【解决方案1】:

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

如果我们查看PrintWriter 的文档:

...如果启用了自动刷新,它将仅在调用 println、printf 或 format 方法之一时完成...

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

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

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

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

【讨论】:

    【解决方案2】:

    使用 telnet (telnet localhost 9001) 测试您的服务器显示它运行良好。我认为它一次只能打印一行而不是单个字符的事实是预期的行为。

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

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

    对于客户,我可以通过将write 替换为println 来解决它:

    out.println(test);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多