2012-03-26 166 views
0

我的服务器套接字有一些问题。我创建一个DatagramSocket在服务器和客户端之间进行聊天。Java套接字服务器阻塞

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

如果您希望能够同时发送和接收数据,您必须将其置于不同的线程中。 – Reinard 2012-03-26 13:41:11

回答

0

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

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

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

修改增加:你可以做的是将你的套接字读取移动到不同的线程,因为这是可中断的。