【问题标题】:Java socket server blockingJava 套接字服务器阻塞
【发布时间】:2012-03-26 13:39:05
【问题描述】:

我的服务器套接字有一些问题。我创建了一个 DatagramSocket 来在服务器和客户端之间聊天。

public static void main (String[] args) throws IOException {

        byte[] send = new byte[1024];
        byte[] receive = new byte[1024];
        BufferedReader entree;
        DatagramSocket serverSocket = null;
        InetAddress ip;
        InetAddress ipDest;
        int port;

        try {
            serverSocket = new DatagramSocket(8888);
        } catch (SocketException e) {
            e.printStackTrace();
        }

        while (true) {
            DatagramPacket recu = new DatagramPacket(receive, receive.length);
            serverSocket.receive(recu);
            String sentence = new String(recu.getData());
            ipDest = recu.getAddress();
            port = recu.getPort();
            System.out.println("Reçu:"+sentence);


            entree = new BufferedReader(new InputStreamReader(System.in));
            String chaine = entree.readLine();
            send = chaine.getBytes();
            DatagramPacket dp = new DatagramPacket(send, send.length, ipDest, port); 
            serverSocket.send(dp);

            send = new byte[1024];
            receive = new byte[1024];
        }

但我使用new BufferedReader(new InputStreamReader(System.in)) 获取下一个要发送的内容,但它正在阻塞。因此,我无法接收来自客户的信息并打印出来。
我该如何安排呢?
谢谢,eo

【问题讨论】:

  • 如果您希望能够“同时”发送和接收,则必须将其放在不同的线程上。

标签: java sockets


【解决方案1】:

尝试在 Java 中对 System.in 进行非阻塞读取是徒劳的。没有可移植的方式来做到这一点,所以 Java 不支持它。

即使您创建一个单独的线程并在那里进行阻塞读取,您也会遇到该线程不可中断的问题。见:Java: how to abort a thread reading from System.in

基本上,您要么需要使用平台特定库 (JNI)(例如,JCurses 用于 linux),要么使用 GUI。

编辑添加:您可以做的是将您的套接字读取移动到不同的线程,因为这是可中断的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多