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

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

------解决方案--------------------
要实现接收多终端的多条信息收发,大体思路这样:
ServerSocket.Accept();这个要写在一个线程中,因为是while (true)。

接收和发送要写在另一个线程中也要while (true)
------解决方案--------------------
探讨
要实现接收多终端的多条信息收发,大体思路这样:
ServerSocket.Accept();这个要写在一个线程中,因为是while (true)。

接收和发送要写在另一个线程中也要while (true)