多线程的socket问题,聊天室程序,服务器端的问题!只开一个客户端时正常,两个就不正常了!                           //问题是这样的,
// 1. 首先有两个用户(A和B)都连接了服务器,
// 2. A 发一条消息
// 3. B 发一条消息
// 4. A 再发一条消息 // 5. B 再发一条消息(服务器没反映)
// 6. A 再发一条消息(正常)
// 7. B 失去作用,断开连接服务器也没反映
                   //主线程
private void ServerStart()
{
Socket ss = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress IPa = IPAddress.Parse("192.168.2.119"); IPEndPoint IPe = new IPEndPoint(IPa , 9000); ss.Bind(IPe); ss.Listen(10); chatListPrintNewLine("服务已经启动,等待连接..!"); while(true)
{
//接受到socket
sClient = ss.Accept(); //添加用户
userJoinIn( sClient );

//新建线程
Thread thread = new Thread (new ThreadStart (clientSocket)); //启动线程
thread.Start(); }
} //用户线程
private void clientSocket()
{
while(true)
{
UserClient uClient = (UserClient)sClientALT[sClientALT.Count - 1]; Socket currentClient = uClient.sClient; int bytes ;

string chatContext = socketGetStr(currentClient,out bytes); if ( bytes == 0 )
{
//用户断开连接
userLeave( uClient );
return;
}
else
{
chatListPrintNewLine( uClient.userName + "的消息:" + chatContext );
} }
} //服务启动按钮
private void serverStartBtn_Click(object sender, System.EventArgs e)
{
if ( mainServerThread == null )
mainServerThread = new Thread (new ThreadStart (ServerStart));

mainServerThread.Start();
serverStartBtn.Enabled = false;
serverStopBtn.Enabled = true;
} //向聊天窗口输出内容
private void chatListPrintNewLine( string chatStr )
{
chatList.Items.Add( chatStr );
chatList.SetSelected( chatList.Items.Count - 1,true );
} //新用户加入
private void userJoinIn( Socket _sClient )
{
string userName = socketGetStr( _sClient ) ;

string sendStr = string.Format( "用户 {0} 的连接已经建立,远程机地址为:{1}",userName ,((IPEndPoint)sClient.RemoteEndPoint).Address.ToString() ); chatListPrintNewLine( sendStr ); UserClient uClient = new UserClient( userName , _sClient ); sClientALT.Add( uClient ); userList.Items.Add( userName );
} //用户断开连接
private void userLeave( UserClient uClient )
{
Socket currentClient = uClient.sClient;

chatListPrintNewLine(uClient.userName + "连接中断! \r\n");


currentClient.Shutdown(SocketShutdown.Both);
currentClient.Close();

userList.Items.Remove( uClient.userName ); sClientALT.Remove(uClient); } //简单的取得socket字符,有长度输出
private string socketGetStr( Socket _sClient ,out int bytesLen )
{
byte[] recvBytes = new byte[256];
bytesLen = sClient.Receive( recvBytes , recvBytes.Length , 0 );
return encoding.GetString( recvBytes ).Trim('\0');
} //无长度输出
private string socketGetStr( Socket _sClient)
{
byte[] recvBytes = new byte[256];
sClient.Receive( recvBytes , recvBytes.Length , 0 );
return encoding.GetString( recvBytes ).Trim('\0');
} //用户结构
public struct UserClient
{
public string userName;
public Socket sClient; public UserClient( string _userName , Socket _sClient )
{
userName = _userName;
sClient = _sClient;
}
}