淺析C#中的套接字編程(3)

淺析C#中的套接字編程(3)
作者: 王凱明   www.ASPCool.com 時間:2002-4-10 21:19:37  

     程序的主體部分應是ServiceClient()函數。該函數是一個獨立的線程,其主要部分是一個while循環。在循環體內,程序處理各種客戶端命令。服務器端接收來自客戶端的以ASCII碼給出的字符串,其中包含了一個“|”形式的分隔符。字符串中“|”以前的部分就是具體的命令,包括CONN、CHAT、PRIV、GONE四種類型。CONN命令建立一個新的客戶端連接,將現有的用戶列表發送給新用戶並告知其他用戶有一個新用戶加入。CHAT命令將新的信息發送給所有用戶。PRIV命令將悄悄話發送給某個用戶。GONE命令從用戶列表中除去一個已離開的用戶並告知其他的用戶某某已經離開了。同時,GONE命令可以設置布爾型的變量keepalive爲false從而結束與客戶端連接的線程。ServiceClient()函數如下:
  
  
  private void ServiceClient()
  
  
  {
  
  
  Socket client = clientsocket;
  
  
  bool keepalive = true;
  
  
  
  
  while (keepalive)
  
  
  {
  
  
  Byte[] buffer = new Byte[1024];
  
  
  client.Receive(buffer);
  
  
  string clientcommand = System.Text.Encoding.ASCII.GetString(buffer);
  
  
  
  
  string[] tokens = clientcommand.Split(new Char[]{'|'});
  
  
  Console.WriteLine(clientcommand);
  
  
  
  
  if (tokens[0] == "CONN")
  
  
  {
  
  
  for(int n=0; n
  
  
  {
  
  
  Client cl = (Client)clients[n];
  
  
  SendToClient(cl, "JOIN|" + tokens[1]);
  
  
  }
  
  
  EndPoint ep = client.RemoteEndPoint;
  
  
  Client c = new Client(tokens[1], ep, clientservice, client);
  
  
  clients.Add(c);
  
  
  string message = "LIST|" + GetChatterList() +"/r/n";
  
  
  SendToClient(c, message);
  
  
  
  
  lbClients.Items.Add(c);
  
  
  
  
  }
  
  
  if (tokens[0] == "CHAT")
  
  
  {
  
  
  for(int n=0; n
  
  
  {
  
  
  Client cl = (Client)clients[n];
  
  
  SendToClient(cl, clientcommand);
  
  
  }
  
  
  }
  
  
  if (tokens[0] == "PRIV")
  
  
  {
  
  
  string destclient = tokens[3];
  
  
  for(int n=0; n
  
  
  {
  
  
  Client cl = (Client)clients[n];
  
  
  if(cl.Name.CompareTo(tokens[3]) == 0)
  
  
  SendToClient(cl, clientcommand);
  
  
  if(cl.Name.CompareTo(tokens[1]) == 0)
  
  
  SendToClient(cl, clientcommand);
  
  
  }
  
  
  }
  
  
  if (tokens[0] == "GONE")
  
  
  {
  
  
  int remove = 0;
  
  
  bool found = false;
  
  
  int c = clients.Count;
  
  
  for(int n=0; n
  
  
  {
  
  
  Client cl = (Client)clients[n];
  
  
  SendToClient(cl, clientcommand);
  
  
  if(cl.Name.CompareTo(tokens[1]) == 0)
  
  
  {
  
  
  remove = n;
  
  
  found = true;
  
  
  lbClients.Items.Remove(cl);
  
  
  }
  
  
  }
  
  
  if(found)
  
  
  clients.RemoveAt(remove);
  
  
  client.Close();
  
  
  keepalive = false;
  
  
  }
  
  
  }
  
  
  }
  
  
  這樣,服務器端程序就基本完成了。(其他略次要的代碼可以參見源代碼中的Form1.cs文件)程序運行圖示如下:
發佈了36 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章