2016-04-12 9 views
0

My resultJavaのTCP同期方法

Expected result

public void run() { 
    try { 
    handlers.addElement (this); 
    broadcast("Welcome " + name); 
    while(handlers.size() != 2){ 
     if(handlers.size() > 2){ 
      this.out.writeUTF ("The Room is full!"); 
      this.out.flush(); 
      handlers.removeElement(this); 
      socket.close(); 
     } 
    } 
    broadcast("No of Player: " + handlers.size()); 
    for(int i = 0; i < handlers.size(); i++){ 
     GameHandler player = (GameHandler) handlers.get(i); 
     broadcast("Player " + (i + 1) + ": " + player.name); 
    } 
    System.out.println("Game starts!"); 
    startGame(4); 
    .... 
} 

protected static void broadcast (String message) { 
    synchronized (handlers) { 
    Enumeration e = handlers.elements(); 
    while (e.hasMoreElements()) { 
     GameHandler handler = (GameHandler) e.nextElement(); 
     try { 
      handler.out.writeUTF (message); 
      handler.out.flush(); 
     } catch (IOException ex) { 
      handler.stop(); 
     } 
    } 
    } 

}

は問題が予想される結果と私の実際の結果との間の差です。 whileループが正常に実行される前の放送が2回実行される理由はわかりません。

+0

可変ハンドラの宣言を提供してください –

+0

ハンドラは(これ) –

答えて

0

あなたの問題は、それぞれのスレッドがブロードキャストを送信していることです。あなたは、「システムアナウンスメント」放送を行うゲームスレッドの「マスター」/「サーバー」を持つ必要があります。または、アナウンスメントを送信するクライアントスレッド(おそらく「プレーヤー1」スレッド)の1つを選択します。

+0

を格納するベクトルですが、なぜ最初のブロードキャストは1回だけ行いますか? –

0

問題は期待された結果と私の実際の結果との違いです。 whileループの前に放送が正常に実行されますが、他は二度実行し、なぜ私は見当がつかない

あなたが本当にあなたの問題について十分な詳細を与えることはありませんが、私はこれらの問題を参照してください。あなたはTCPについて話

  • をコードにはソケットが記述されていますが、ローカルelementsコレクションを処理しています。同じJVM over TCP(奇妙なことです)と話さない限り、elementsコレクションは各クライアントで2人のプレイヤーを開始します。それは本当にあなたが期待するものですか?
  • elementsVectorだと言っても、run()メソッドの開始時にはまだsynchronizeにする必要があります。これは、複数の操作を実行して競合状態があるためです。たとえば、3つのハンドラが追加された場合、ハンドラはすべて削除され、独自のソケットを閉じます。
  • Vectorは本当に古いコレクションです。あなたは別のものを使うべきです。
  • 最初のスレッドが自分自身をelementsに追加すると、2番目のスレッドがゲームに参加するのを待つスピンループに入ります。そこには浪費のようです。いくつかの小さなThread.sleep(...)が適切でしょう。
  • 部屋がいっぱいの場合は、run()の方法でスレッドをreturn;にする必要があります。代わりに、それは私が良いとは思わないで続行します。

ここに何かが役立ちます。

関連する問題