【问题标题】:Java socket programming. How can i wait for server response in the background?Java 套接字编程。如何在后台等待服务器响应?
【发布时间】:2015-09-23 23:11:20
【问题描述】:

我正在尝试构建一个客户端/服务器程序,它工作正常。当我发送一条消息时,它会显示在服务器上,然后它等待来自服务器的响应,但是在等待响应时我什么也做不了。

我的问题是:我怎样才能在后台等待响应,而我仍然可以发送消息并在发送时只显示服务器消息(如果已发送)。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;


public class Client {
public static void main(String[] args) throws IOException,UnknownHostException{

    // Specify remote address and port
    Socket cs = new Socket("localhost", 1337);
    // Input and Output
    DataInputStream dis = new DataInputStream(cs.getInputStream());
    DataOutputStream dos = new DataOutputStream(cs.getOutputStream());

    // Writing message to the server
    String message = null;
    Scanner scan = new Scanner(System.in);

    while(true){
        message = scan.nextLine();
        if(message.equals("exit")) System.exit(0);
        dos.writeUTF(message);
        dos.flush();
        // Check for messages from server ---> Here i wait for a message from the server but how can i wait in background without having my program freeze?
    }
}

}

【问题讨论】:

  • 它称为线程。 javas 套接字被设计为阻塞,因为你应该在不同的线程中运行它们。在那个线程中,您可以等待,当有事情发生时,您可以使用某种事件监听器将其返回到 ui(或控制台)。简而言之:查找java中的多线程教程
  • 感谢您的回复

标签: java sockets


【解决方案1】:

Java 中最简单的方法是在单独的线程中侦听服务器数据。

使输入流最终化,并在从控制台读取的 while 循环之前插入类似这样的内容:

new Thread() {
  public void run() {
    try {
      while (true) {
        System.out.println(dis.readUTF());
      }
    } catch(IOException e) {
      e.printStackTrace();
    }
  }
}.start();

这会创建一个Thread 的匿名子类,当start 被调用时,它将在后台执行run 方法。

当您的代码增长时,您可能希望在一个单独的类中实现 Runnable 接口,并将其交给 Thread 构造函数。

【讨论】:

  • 如果这解决了您的问题,您可能希望接受答案(添加复选标记),因此它不会保持打开状态... 更容易找到仍然打开的问题...
  • 仅供参考(我认为这并不重要):System.out.println(); 不是线程安全的。如果从不同的线程调用(实际上发生在我身上),我可能会杀死 jvm。使用线程,线程安全始终是一个问题,阅读它不会受到伤害(很多;))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多