当服务器端同时处理多个连接时,服务器端就创建多个socket,我用socket.handle标记着多个句柄,并保存到一个句柄数组中,请问怎样通过保存的句柄,查询其对应的socket,并利用socket发送反馈信息到客户端?还是可以直接利用句柄可以发送信息?
服务器部分代码如下:
clientSocket = stServer.Accept();
 Socket childClient = clientSocket;  
 while (keepalive)
  {
  try
  {
  Byte[] byBuff = new Byt[8192];   
childClient.Receive(byBuff, byBuff.Length, 0);
  string strBuff = Encoding.Default.GetString(byBuff).TrimEnd('\0');   
    
  socketFlag = childClient.Handle.ToString(); //得到此SOCKET的句柄,用做SOCKET标识
  endPoint = childClient.RemoteEndPoint; //客户端IP+端口f (strBuff.Length >= 3)
  {
  string sFg = strBuff.Substring(0, 3);  if (sFg == "LOD") //客户端上线:客户端上线时要发送LOD标识
  {
  HandleArray.Add(socketFlag); //加入SOCKET句柄到数组列表中
  Socket_Connection(0, endPoint,socketFlag); //调用上线处理函数
  }
 private void Socket_Connection(int flag, EndPoint ep, string hd)
  {
  IPEndPoint IPpoint = ((IPEndPoint)ep);  string hostIP = IPpoint.Address.ToString(); //IP地址
  string hostPort = IPpoint.Port.ToString(); //端口号  IPHostEntry myHost = Dns.GetHostByAddress(hostIP);
  string hostName = myHost.HostName; //主机名  int index = lstViewServer.Items.Count + 1;
  ListViewItem lstItem = new ListViewItem(index.ToString());  if (flag == 0) //上线
  {
  lstItem.SubItems.Add(hostName);
  lstItem.SubItems.Add(hostIP);
  lstItem.SubItems.Add(hd);
  lstItem.SubItems.Add(hostPort);
  lstItem.SubItems.Add(DateTime.Now.ToString());
  lstAdd(lstItem);
  }在此基础上,怎样通过操作socket句柄,增加一个服务器发送信息的功能?本人socket刚入门,请指教

解决方案 »

  1.   

    把你的 clientSocket 保存到一个 List<Socket> 集合中就行了。这叫做面向对象编程,而不是什么面向字符串或者句柄编程。
      

  2.   

    childClient.Receive(byBuff, byBuff.Length, 0)代码返回的就是接收到的数据的长度,例如你可以把它赋值给len变量。然后你就可以读取byBuff中len个字节的内容了,而不是去查找什么Encoding.Default.GetString(byBuff).TrimEnd('\0')另外,服务器完全可能收到超过8192个字节的消息,比如说是890000个字节(差不多800K字节),你使用8192字节的缓冲需也是要循环接收到的,而不能每当接受8192个字节就去想当然地去变成什么Default编码的字符串。更何况服务器端可能收到的消息不是仅仅只有一个消息报,可能是两个消息粘在一起的,也就是8192个字节中有前一个消息的后面一部分以及后一个消息的前面一部分字节,连在一起。因此需要接收到某个消息结束标志之后再将接收到的所有字节(例如900000个字节)正确地分成多个消息报,再分别对每一个消息进行字符串解码。另外,不要胡乱使用Encoding.Default。在不同操作系统上,这个代码给出完全不同的结果。你这个代码放到不同系统的机器上难道也允许出现迥异的运行结果?应该使用Encoding.UTF8等,而不是什么Encoding.Default。后边的代码懒得看了。
      

  3.   

    大侠 private static List<Socket> li = new ArrayList<Socket>();这样声明一下  li  就包含所有连接的 socket 了么我要根据IP 和端口调用其中指定的socket怎么办呢。
      

  4.   

    private static List<Socket> li = new ArrayList<Socket>();,这只是new了一个List,你没创建一个socket就加到li中
      

  5.   


    private static List<Socket> li = new List<Socket>(); 这是C#的应该这样写
    我在程序中已经把创建的socket就加到li中,关键是我要用其中指定的socket发数据。比如我知道这个socket的IP和端口,我怎么选中这个socket呢。
      

  6.   


       foreach (Socket clients in li)
      {
           if (clients.Handle.ToString() ==textBox3.Text)
          {
              byte[] sendmsg = Encoding.Unicode.GetBytes(this.textBox3.Text + "\n");
              clients.Send(sendmsg);          
          }
      }
    搞定