2016-04-12 56 views
0

My resultJava TCP senkronize yöntem

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

}

sorun beklenen sonucu ve benim gerçek sonucu arasındaki farktır. While döngüsünden önce yayının neden normal çalıştığını bilmiyorum ama diğerleri iki kez çalıştırıyorlar.

+0

Lütfen değişken işleyicilerin bildirimini sağlayın –

+0

işleyicileri, (bu) –

cevap

0

Sorununuz, sizin durumunuzda, iş parçacığının her birinin yayını göndermesidir. Ya “sistem duyurularını” yayınlayan oyunların bir "ana"/"sunucusuna" sahip olmanız, ya da duyuruları göndermek için istemci iş parçacıklarından birini (belki "oynatıcı 1" iş parçacığı) seçmeniz gerekir.

+0

'u saklayan bir vektördür, ancak ilk yayın neden yalnızca bir kez yapar? –

0

Sorun, beklenen sonuç ile gerçek sonuç arasındaki farktır. while döngüsünde önce yayın normal çalışıyor ama diğerleri iki kez çalıştırmak niçin hiçbir fikrim yok

Gerçekten sorun üzerinde yeterince bilgi vermek yok ama bu sorunları: bkz TCP bahsetmek

  • ve kod, yuvalardan bahseder ancak yerel bir elements koleksiyonunu işliyorsunuz. TCP üzerinden aynı JVM ile konuşmuyorsanız (ki bu gariptir) elements koleksiyonu her bir istemcide 2 oyuncuya başlayacak. Bu gerçekten beklediğin şey mi?
  • elements bir Vector olduğunu söylemesine rağmen, run() yönteminin başlangıcında hala üzerinde birden çok işlem gerçekleştirdiğiniz ve yarış koşullarınız olduğu için synchronize yöntemine ihtiyacınız vardır. Örneğin, 3 işleyici eklendiyse, hepsi kendilerini kaldırır ve kendi yuvalarını kapatırlar.
  • Vector gerçekten güncel olmayan bir koleksiyon. Başka bir şey kullanmalısın.
  • İlk iş parçacığı kendisini elements'a eklediğinde, ikinci kişinin oyuna katılmasını bekleyen bir dönüş döngüsüne girer. Orada atık gibi görünüyor. Bazı küçük Thread.sleep(...) uygun olurdu.
  • Oda doluysa, iş parçacığının run() yönteminden return; olması gerektiğinden şüpheleniyorum. Bunun yerine, iyi olmadığından şüphelendiğim devam ediyor.

Burada bir şeylerin yardımcı olmasını umarız.