2011-07-03 10 views
2

私はソケットプログラミングの新人で、簡単なcmdラインチャットアプリケーションを作成しようとしています。 以下のコードを使用して接続を受け入れ、新しいスレッドを作成しますが、新しいスレッドは作成されません。サポートされているクライアントは1つもありません(スレッドが使用されない場合は通常です)。別々のスレッドが作成されないのはなぜですか?

public class chatserver extends Thread{ 
    public static Socket client; 
    public static void main(String a[]) throws Exception{ 
     ServerSocket srv = new ServerSocket(4444); 
     if((client = srv.accept())!=null){ 
      new newthread(client); 
     } 
    } 
} 
class newthread extends Thread{ 
    private Socket client; 
    public newthread(Socket client){ 
     super("chatchild"); 
     this.client = client; 
     start(); 
} 

スレッドが作成されない理由「oracle.com」に例を挙げましたが、その中の1つに同じコードが含まれていますが、何が起きるか正確な順序を把握できません。The snippet接続を受け入れ、スレッドを作成exapleコードから::

while (listening) 
     new KKMultiServerThread(serverSocket.accept()).start(); 

は今ここにリスニングはブールvarがtrueに座って、それをfに設定されることはありませんですコード内のどこにでも置くことができます。どのように機能しますか?

+1

あなたが次の例を正確に示していますか?あなたのクラスは単純な 'Thread'よりも' Thread'から派生しているので、自分の作業を完了させるのは非常に奇妙です。 – sarnold

+1

もう1つ..コンストラクタ内でスレッドを開始しないでください。完全に構築されていないオブジェクトをこのスレッドで見ることができるため、安全ではありません。 –

+0

@sarnold私は[リンク](http://download.oracle.com/javase/tutorial/networking/sockets/)の例を次のようにしています。\ – buch11

答えて

2

あなたが継続的に他のスレッドを作成するために)(受け入れを呼び出す必要があり:変数を聴い

public static void main(String a[]) throws Exception{ 
    ServerSocket srv = new ServerSocket(4444); 

    while (listening) { 
     new newthread(srv.accept()); 
    } 
} 

があればfalseに設定する必要がありますし、サーバーを停止したいとき。

2

実行方法はどこですか? ThreadまたはRunnableのrunメソッドがなければ、あなたのスレッドは何もできないと思います。

+2

+1 - 具体的には、何もしないデフォルトの 'run'メソッドを実行し、スレッドは直ちに終了します。 –

+0

私はスレッドスーパークラスを拡張したので、Runnableインターフェイスを実装する必要はありません。スレッドクラス自体のメソッドを使用できます。 – buch11

+0

@Stephen C私のプログラムではrun()メソッドを持っていますが、その部分をポストしていないので、スレッドは時間の一部として生成されていない必要がありました... – buch11

0

最後に私はこの問題を解決しました。最初のクライアントの連絡先の後でsocket.accept()メソッドがアクティブなままではなかった... runメソッドで何も問題がなかった、socket.accept()メソッド...