2012-03-24 5 views
0

特定のサーバーソケットポート上のクライアントを接続し、サービスクラスを持つスレッドを開始するサーバークラスがあります。具体的には、私は3つのサービスクラスを持っていますので、3つの異なるポートを持ちたいと思います。しかし、これは私が期待していたように機能していません。これは、サーバーのための私のコードです:クライアント/サーバーモデル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(); 
      } 
     } 
    } 
} 

私は例えば一つのポートを使用する場合、それは正常に動作します:

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(); 
//   } 
     } 
    } 
} 

任意の助けをいただければ幸いです。

+0

このような状況になった場合は、デバッグ行 'System.out.println(" hi ");'を表示する必要があります。 "hi"が表示されていない場合は、問題があります。 –

+0

ありがとう!それは役に立ちます:)今はaccept()ブロックを手に入れましたが、3つの異なるサービスを唯一のポートで提供するにはどうしたらいいですか? – Dan

+0

あなたは何を意味するのか分かりません。このアプリケーションは、2つのポート(22401と22402)にサービスを提供します。sethcallの推奨によると、ServerSocketインスタンスごとに1つのスレッドを使用する必要があります。私は答えで説明します。 –

答えて

1

acceptメソッドは、接続が確立されるまでブロックします。したがって、他のサーバーにアクティビティがあっても、.accept()はブロックされて座っています。 1つの簡単な解決策は、サーバーごとに1つのリスニングスレッドを作成することです。

1

accept()はブロッキング方法です。つまり、2番目のaccept()は別の接続を待っています。 2番目の接続が許可されると、コードはブロックされます

0

別のスレッドでaccept()メソッドを呼び出す必要があります。 accept()は、誰かがサーバーに参加するまでスレッドをブロックします。これは、1ミリ秒または1年とすることができる。

私はあなたが誰かが

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

およびハンドラクラス

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()); 
     } 
    } 
} 

に参加するときは、エラーやその他もろもろを処理し、あなたのサブクラスでオーバーライドを作成する必要があります呼び出されるAcceptListenerを作成することをおすすめ

AcceptListenerの(単数または複数の)

関連する問題