【问题标题】:Java Client ServerJava 客户端服务器
【发布时间】:2017-06-19 15:08:55
【问题描述】:

我正在尝试将消息从服​​务器传递到终端中的客户端。我希望程序做的是,在客户端,它应该能够输入命令,从服务器获取响应,并且能够在不重新启动客户端(通过 java 客户端)的情况下输入另一个命令。

Client.java

Socket socket = new Socket(host, port);
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

String response = "";

boolean continuation = true;
while(continuation) {
    Scanner input = new Scanner(System.in);
    String command = (input.nextLine()).toString();
    bw.write(command+"\r\n");
    bw.flush();

    if(command.equals("cmd1") {
        while ((response = br.readLine()) != null) {
             System.out.println(response);
        }
    }
    System.out.println("This line will not execute as well.");
}

Server.java

InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);

String[] in = br.readLine().split("\\s+");
String command = in[0];

if(command.equals("cmd1")) {
    String response = "";
    response = response + "RESPONSE:\r\n";
    response = response + "This is a response.\r\n";
    bw.write(response);

    bw.flush();
}

如果我在Client.java中不放while((response = br.readLine()!= null) { ... },是可以在终端输入多个输入的,但是如果我放的话,它打印来自服务器的响应,如果不重新启动客户端,则无法完成另一个输入。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 重启客户端是什么意思?您的意思是说当响应为 null 时 Client.java 将被终止?
  • 当我在终端中输入一些命令并回车时,服务器应该会发送一个响应,该响应会在客户端打印。但是,在此之后,无法输入另一个命令并按 Enter 并接收来自服务器的响应。我必须终止客户端并重新启动它。
  • 我希望它能够连续输入命令并获得响应,而无需通过 java Client 重新启动 Client

标签: java sockets io client-server


【解决方案1】:

这应该可行:

服务器:

DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

boolean continuation = true;
while (continuation) {
    String command = dis.readUTF();
    //proceeed command
    dos.writeUTF("response");
    dos.flush();
}

客户:

DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

    dos.writeUTF("your command");
    while (dis.available() == 0) {
        try {
            //wait for response
            Thread.sleep(1);
        } catch (InterruptedException ex) {
            Logger.getLogger(RandomTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    String response = dis.readUTF();
    //and so on

【讨论】:

  • 我需要传递带有换行符和回车的字符串。这可以通过writeUTF实现吗?另外,我需要从客户那里得到持续的输入。例如。来自客户端的 cmd1 响应(此处不终止) 来自客户端的 cmd2 第二个响应
  • 是的,使用 writeUTF 也可以换行!如果您想从客户端获得连续输入,您应该在不同的端口上设置一个新的连接,或者您一直在等待响应并将响应分为两种类型:1.在命令的响应中和 2.作为某些通用侦听器其他命令..
  • 如何在客户端循环直到用户输入“退出”?目前,正在发生的事情是服务器发送响应,客户端打印它,然后它既不会进入循环到另一个“输入”,也不会终止客户端。它只是显示终端的闪烁光标
  • 例如,如果我在 if (command.equals...) 之外但在 while(continuation) 内写一些东西,在得到 readLine() 之后,那行代码甚至不会执行跨度>
  • 但是你收到电话了吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多