【问题标题】:Echo Server doesn't echo回声服务器不回声
【发布时间】:2016-04-13 20:06:23
【问题描述】:

我正在尝试编写一个回显客户端服务器,但我没有得到服务器的任何响应。不知道我的错误在哪里。 我在网上看到过一些例子。有些人只使用 InputStream/OutputStream,但我决定使用 BufferedReader 和 PrintWriter - 这有什么大区别吗?

服务器端:

public class Server {

public static void main(String[] args){
    Server server = new Server();   
    server.runServer(Integer.parseInt(args[0]));
}

private void runServer(final int port){
    ServerSocket serversckt = null;
    Socket socket = null;
    BufferedReader in = null;
    PrintWriter out = null;

    try{
       serversckt = new ServerSocket(port);
       socket = serversckt.accept();
       System.out.println("Request from client accepted!");


       in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
       out = new PrintWriter(socket.getOutputStream(), true);

       String str;
       while((str = in.readLine()) != null){
           System.out.println(str);
           out.println(str);
           out.flush();
       }
    }
     catch (IOException e) {
        System.out.println(e.getMessage());
    }   

}
}

客户端:

public class Client{

public static void main(String[] args){
    Client client = new Client();   
    client.runClient(Integer.parseInt(args[0]), args[1]);
}

private void runClient(final int port, final String hostname){
    Socket sckt = null;
    try{
        sckt = new Socket(hostname, port);
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader in = new BufferedReader(new InputStreamReader(sckt.getInputStream()));
        PrintWriter out = new PrintWriter(sckt.getOutputStream(), true);

        String str;
        while((str = stdIn.readLine()) != null){
            out.println(str);
            System.out.println(in.readLine());
        }

    } catch(IOException e){
        System.out.println(e.getMessage());
    }
}

谢谢!

【问题讨论】:

  • 我不认为服务器中的while((str = in.readLine()) != null) 是阻塞调用,所以在第一次读取时它将是null,然后它将终止服务器。也许其他人对BufferedReader 以及它是否在那里阻塞有更多的了解。
  • 你真的可以调用不回显echo服务器的回显服务器吗?
  • @thatotherguy 这很可能是重点:从控制台读取,将其发送到服务器并读取其“回声”。 @OP System.out.println(in.readLine()); 也可能不会阻塞,因此它会显示“无”,因为服务器处于离线状态(阅读我的第一条评论)或没有时间回答。

标签: java sockets server client echo


【解决方案1】:

我无法重现您的问题。我在 Client.java 中添加了缺失的导入和最终的},编译并在不同的终端中运行服务器和客户端。

客户:

$ java Client 2000 本地主机


酒吧
酒吧

服务器:

$ java 服务器 2000
已接受客户的请求!

酒吧

每次我在客户端窗口写东西时,它都会回显给我,服务器上也会出现同样的行。

【讨论】:

  • 我发现我的错误(它是日食)!代码确实正确!
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多