日期:2014-05-18  浏览次数:20823 次

C#套接字编程关于不能循环接受客户端的问题
下面是我用C#编写的服务器端监听客户端的部分代码,主要用于响应客户端的连接请求和循环接收客户端发来的信息,但是程序运行的时候能响应多个客户端的连接请求(即客户端能与服务器端能正常连接),但是对于客户端发送信息的时候,服务器端只能接受一条聊天信息,客户端再次发送信息的时候就接收不到了,而且所有的客户端都是这样,用红色标记的地方程序的主要错误所在(也就是我写的注释:接受客户端连接的方法下面的那段代码),大家帮我看看怎样修改这段程序可以让服务器端能正常处理所有客户端发来的信息:(我的目的是实现像qq群聊天一样的功能:即有一个说话,所有在线的客户都可以收到信息,我的思想是通过服务器端接收客户端发来的聊天信息,再通过服务器发送给所有的在线用户):
  //服务器开始运行
  private void Startbutton_Click(object sender, EventArgs e)
  {
  ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  ServerInfo = new IPEndPoint(IPAddress.Any, 8001);
  ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定  
  ServerSocket.Listen(10);//开始监听
  MsgBuffer = new byte[65535];//消息数据大小  
  socket = ServerSocket.Accept();
  ClientSockets.Add(socket);
  ServerThread = new Thread(RecieveAccept);//将接受客户端连接的方法委托给线程  
  ServerThread.Start();//线程开始运行
  CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
  Startbutton.Enabled = false;
  Stopbutton.Enabled = true;
  StateMsg.Text = "服务正在运行" + " 运行端口:" + 8001 + "\n";
  ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 开始运行.");
  }
  
  //接受客户端连接的方法
  private void RecieveAccept()
  {
  while (true)
{
socket = ServerSocket.Accept();
try
{
ClientSockets.Add(socket);
ClientSockets[ClientSockets.Count - 1].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), ClientSockets[ClientSockets.Count - 1]);
ClientList.Items.Add(ClientSockets[ClientSockets.Count - 1].RemoteEndPoint.ToString() + " 成功连接服务器.");
ClientList.Items.Add("在线人数" + ClientSockets.Count); }
  catch (Exception ex)
  {
  MessageBox.Show(ex.Message);
  }
  }
  }

------解决方案--------------------
看我资源里分享的网游服务端模拟器,关于这方面的东西里面有很多可以学
------解决方案--------------------
1 下面这2句不要,直接线程接受连接就行:
socket = ServerSocket.Accept();
ClientSockets.Add(socket);
2 开始BeginReceive,EndReceive收到消息后,要再次BeginReceive才能继续收下面的消息.