2012-03-26 14 views
4

Ich versuche, eine Multithread-Server/Client-App mit Java zu machen! Dieser Code ist für listen() Methode in einer Klasse von einem Paket, das Bsocket (iserver.core.socket) genannt:JAVA - Socket.accept() friert ui ein

try { 
    serverSocket = new ServerSocket(port); 
}catch(IOException e){ 
    ui.log(e.toString());//* 
} 
while (true){ 
    try{ 
     clienSocket = serverSocket.accept(); 
     ui.log("Incomming Connection.");//* 
     new connectionHandler(clienSocket, ui); 
    }catch(IOException e){ 
     ui.log(e.toString()); 
    } 
} 

ui.log("Incomming Connection."); ist ein Verfahren, bei unterhalb der Hauptklasse Bgui (iserver.core.ui) .Bgui ist ein Jframe, das ein Textfeld und etwas anderes enthält! Das Problem ist, wenn die akzeptierten Methoden ausgeführt, die ui.log hat nicht funktioniert! Was ist hier falsch?

+0

Die Frage ist vollständig informiert !!! aber einige Infos sind optional! Du magst -1 huh? :) OK ! schau dir 'dty' antwort an! – bizzr3

+1

Sie sollten sich dies [Tutorial über SwingWorker] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) ansehen – assylias

+0

Heh, ich habe die -1 rückgängig gemacht, sobald ich herausgefunden habe, dass Sie wusste nicht, wie UI-Systeme funktionierten. Ich war verwirrt, als ich über Log-Output und Jframes sprach. – Gray

Antwort

4

Sie müssen UI-Threads von Ihren eigenen Netzwerkservice-Threads trennen. accept() blockiert (offensichtlich) und friert Ihre Anwendung ein, bis Sie einen neuen Client erhalten, und friert erneut ein, während Sie auf weitere Clients warten.

+0

Kannst du mir mehr über das Trennen dieser Schichten erzählen? – bizzr3

+1

Dies ist eine kurze Frage mit einer wirklich großen Antwort. Sie müssen einige Konzepte zur Nebenläufigkeit lernen. Es ist sehr wichtig, UI-Anwendungen zu entwickeln. Oracle bietet einige interessante [Tutorials zum Thema Parallelität in Swing-Anwendungen] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). – logoff

+0

Vielen Dank für Ihre Aufmerksamkeit – bizzr3

6

Socket.accept() blockiert, bis eine eingehende Verbindung empfangen wird (siehe Dokumentation). Sie sollten keine blockierenden Aufrufe von Ihrem UI-Thread ausführen - sonst wird es ... Sie wissen ... blockieren!

7

Sie müssen Ihren Server auf einem separaten Thread starten, da .accept ein blockierender Anruf ist.

(new Runnable() { 
    @Override 
    public void run() 
    { 
     try { 
       serverSocket = new ServerSocket(port); 
      }catch(IOException e){ 
       ui.log(e.toString());//* 
      } 
     while (true){ 
      try{ 
       clienSocket = serverSocket.accept(); 
       ui.log("Incomming Connection.");//* 
       new connectionHandler(clienSocket, ui); 
      }catch(IOException e){ 
       ui.log(e.toString()); 
      } 
     } 
    } 
}).start(); 

HINWEIS: Dieser Code ist nicht getestet, aber es sollte Ihnen eine Vorstellung davon geben, was Sie tun müssen, Sie könnten so etwas wie dies tun möchten.