2012-03-24 6 views
0

Ich habe eine Server-Klasse, die einen Client an einem bestimmten Server-Socket-Port verbindet und einen Thread mit einer Serviceklasse startet. Konkret habe ich 3 Serviceklassen, also möchte ich 3 verschiedene Ports haben. Dies funktioniert jedoch nicht so, wie ich es erwartet hatte. Dies ist mein Code für den Server:Client/Server-Modell Java

import java.net.ServerSocket; 
import java.net.Socket; 
import java.io.IOException; 

public class WebsiteServer { 

    public static void main(String args[]) throws IOException { 

     ServerSocket serversocket = new ServerSocket(22401); 
     ServerSocket serversocket2 = new ServerSocket(22402); 
     Thread thread; 
     Thread thread2; 
     Socket socket; 
     Socket socket2; 
     NewUserService newuserservice; 
     ExistingUserService existinguserservice; 

     System.out.println("Waiting for clients to connect."); 

     while (true) { 

      socket = serversocket.accept(); 
      socket2 = serversocket2.accept(); 

      if(socket.isConnected()) { 

       System.out.println("NewUserClient has connected."); 
       newuserservice = new NewUserService(socket); 
       thread = new Thread(newuserservice); 
       thread.start(); 
      } 

      if(socket2.isConnected()) { 

       System.out.println("ExistingUserClient has connected."); 
       existinguserservice = new ExistingUserService(socket2); 
       thread2 = new Thread(existinguserservice); 
       thread2.start(); 
      } 
     } 
    } 
} 

Es funktioniert gut, wenn ich nur einen Port verwenden, zB:

import java.net.ServerSocket; 
import java.net.Socket; 
import java.io.IOException; 

public class WebsiteServer { 

    public static void main(String args[]) throws IOException { 

     ServerSocket serversocket = new ServerSocket(22401); 
     ServerSocket serversocket2 = new ServerSocket(22402); 
     Thread thread; 
     Thread thread2; 
     Socket socket; 
     Socket socket2; 
     NewUserService newuserservice; 
     ExistingUserService existinguserservice; 

     System.out.println("Waiting for clients to connect."); 

     while (true) { 

      socket = serversocket.accept(); 
      //socket2 = serversocket2.accept(); 

      if(socket.isConnected()) { 

       System.out.println("NewUserClient has connected."); 
       newuserservice = new NewUserService(socket); 
       thread = new Thread(newuserservice); 
       thread.start(); 
      } 

//   if(socket2.isConnected()) { 
//     
//    System.out.println("ExistingUserClient has connected."); 
//    existinguserservice = new ExistingUserService(socket2); 
//    thread2 = new Thread(existinguserservice); 
//    thread2.start(); 
//   } 
     } 
    } 
} 

Jede mögliche Hilfe würde geschätzt.

+0

Wenn Sie in einer Situation wie dieser landen, sollten Sie Debug-Zeilen einfügen, 'System.out.println (" hi ");' Wenn Sie das "hi" nicht sehen, wissen Sie, dass ein Problem vorliegt! –

+0

Danke! Das würde helfen :) Ich bekomme das accept() jetzt blocken, aber wie kann ich dann auf nur 1 Port drei verschiedene Dienste anbieten? – Dan

+0

Ich bin mir nicht sicher, was du meinst. Diese Anwendung bedient zwei Ports, 22401 und 22402. Wie von sethcall vorgeschlagen, sollten Sie einen Thread pro ServerSocket-Instanz verwenden. Ich werde es in einer Antwort erklären. –

Antwort

1

Die accept-Methode blockiert, bis eine Verbindung hergestellt wird. Also, Sie sitzen blockiert eine .accept(), obwohl der andere Server Aktivität haben kann. Eine einfache Lösung wäre, einen Überwachungsthread pro Server zu erstellen.

1

accept() ist eine Blockierungsmethode. Mit anderen Worten, die zweite accept() wartet auf eine andere Verbindung. Untik eine zweite Verbindung wird akzeptiert, Ihr Code wird blockiert

0

Sie müssen die accept() Methode in einem separaten Thread aufrufen. accept() blockiert den Thread, bis jemand dem Server beitritt. Dies könnte 1 ms oder 1 Jahr sein.

Ich schlage vor, Sie ein AcceptListener erstellen aufgerufen werden, wenn jemand

public interface AcceptListener{ 
    public void socketAccepted(Socket s); 
} 

Und eine Handler-Klasse

public class MyServerSocket extends Thread{ 
    private AcceptListener l; 
    private boolean run = true; 
    private ServerSocket s; 
    public MyServerSocket(AcceptListener l, int port){ 
     this.l = l; 
     this.s = new ServerSocket(port); 
     this.start(); 
    } 
    public void run(){ 
     while(run){ 
      l.socketAccepted(s.accept()); 
     } 
    } 
} 

verbindet werden Sie müssen Fehler und so weiter behandeln und die Überschreibungen machen in Sie Unterklasse (es) von AcceptListener.