2012-03-26 8 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、

+1

「同時に」送信と受信の両方ができるようにするには、別のスレッドに配置する必要があります。 – Reinard

答えて

0

Javaで非ブロック読み取りを行うと、System.inが無駄になります。ポータブルな方法はないので、Javaではサポートしていません。

別のスレッドを作成してブロックを読み込んでも、そのスレッドが中断されないという問題があります。参照:Java: how to abort a thread reading from System.in

基本的には、プラットフォーム固有のライブラリ(JNI)(たとえば、linuxの場合はJCurses)を使用するか、GUIを使用する必要があります。

編集の追加:できることは、割り込みが可能なので、あなたのソケットの読みを別のスレッドに移動することです。

関連する問題