线程服务器 - 客户端(HashMap +套接字+ MultiThreads)

时间:2013-04-14 14:36:27

标签: java multithreading sockets hashmap

如果像我这样的话题存在,我很抱歉。 我也很抱歉英语。 问题是什么 ?。 我总是写MultiThread服务器,我无法从客户端“同步”线程。 我决定将所有客户端线程放在HashMap中。它工作正常,因为我可以看到我的Hashmap正在成长。 客户端类将识别他从服务器获得的消息,他还会执行其他操作。 例如:

 DataInputStream xyz = new DataInputStream( client.getnputStream() );
 public void run() 
 { 
    while(true) 
    { 
       String msg = xyz.readUTF(); 
       if( msg.equals("ABC") ) 
       { 
           ** some action ** 
       } 
       else if( msg.equals("123"); 
       { 
           ** some action **/ 
       } 
    }   
  } 

那是一个客户端类。 在Server_Thread类中,我想要这样的想法。对象“一”将获得msg“ABC”更多的同时对象“两个”“树”....将得到msg“123”。如果对象“one”将结束他的“某个动作”,他将把msg发送到服务器,而服务器将更改对象。现在对象“one”将获得msg“123”,对象“two”将获得msg“ABC”,对象“3”....将获得msg“123”。 我认为Iterator将是一个很好的解决方案,所以在我的Server_Thread类中我写道:

  DataOutputStream abc = new DataOutputStream( xxx.getOutputStream());
  public void run() 
  { 
    while(true) 
    { 
        synchornized(this) 
        { 
         for( Map.Entry <String,Server_Thread> iterator : iterator.entrySet() ) 
         { 
             iterator.getValue().abc.writeUTF("ABC");  
             others( this) ; 
         }  
       }
    } 
  } 
  public void others(Server_Thread object) 
  { 

      DataOutputStream abc = new DataOutputStream( xxx.getOutputStream()); 
      synchronized(this) {
      for( Map.Entry <String,Server_Thread> iterator : iterator.entrySet() ) 
      { 
         if(iterator.getValue() != object) 
         { 
             iterator.getValue().abc.writeUTF("123"); 
         }  
       }   
       } 
  } 

此外,代码以这种方式工作。客户“一”得到“ABC”,但如果**突然客户端“两个”将加入,客户端“一”将以这种方式获得消息: “ABC 123 ABC 123 ABC 123 ABC 123 .........”

但是客户“两个”会以这种方式得到消息:
“ABC ABC ABC ABC ABC ABC ......”

**我写了“突然”,因为客户可以在他想要的时候加入。

非常感谢您的帮助。 坏

@EDIT
我的问题是如何修复它。它应该工作(客户“一个”做一些事,因为他得到msg“ABC”,其他客户端应该等待客户端“一个”。如果他做了,他可以发送一些思考服务器eq“我做完了”然后客户端“两个” “可以做一些事情,其他人等他。但是我不能”同步“,客户线程相互混合(我认为这就是问题)。

0 个答案:

没有答案