Java套接字服务器阻塞

时间:2012-03-26 13:39:06

标签: java sockets

我的服务器套接字有问题。我创建了一个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))获取要发送的下一个内容,并且它正在阻止。所以,我无法接收来自客户端的内容并将其打印出来 我怎么安排呢? Merci,eo

1 个答案:

答案 0 :(得分:0)

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

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

基本上,您需要使用特定于平台的库(JNI)(例如,用于Linux的JCurses),或者使用GUI。

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