2012-03-26 18 views
0

Ich habe ein paar Probleme mit meinem Server-Socket. Ich erstelle einen DatagramSocket, um zwischen einem Server und einem Client zu chatten.Java-Socket-Server blockiert

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]; 
     } 

Aber ich benutze new BufferedReader(new InputStreamReader(System.in)) das nächste Material, Sie bekommen, und es blockiert. Also kann ich nicht empfangen, was vom Kunden kommt und es ausdrucken.
Wie kann ich das arrangieren?
Merci, eo

+1

Sie müssen es auf verschiedene Threads setzen, wenn Sie gleichzeitig "senden und empfangen" können. – Reinard

Antwort

0

Der Versuch, nicht-blockierende liest auf System.in in Java ist eine Übung in Vergeblichkeit. Es gibt keinen portablen Weg, dies zu tun, weshalb Java dies nicht unterstützt.

Auch wenn Sie einen separaten Thread erstellen und eine Blockierung lesen, haben Sie das Problem, dass der Thread nicht unterbrechbar ist. Siehe: Java: how to abort a thread reading from System.in

Grundsätzlich müssen Sie entweder eine plattformspezifische Bibliothek (JNI) (JCurses für Linux zum Beispiel) verwenden oder eine GUI verwenden.

Bearbeiten Hinzufügen: Was Sie tun können, ist Ihre Socket lesen in einen anderen Thread zu verschieben, da dies unterbrechbar ist.