C#網絡編程------多線程socket實例--好啊~~


服務器端代碼:

[c-sharp] 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Net;  
  6. using System.Net.Sockets;  
  7. using System.Threading;  
  8.   
  9. namespace multithreadservTest  
  10. {  
  11.     class Threadtcpserver  
  12.     {  
  13.   
  14.         /* 本程序中采用了多線程技術,可以應付多客戶的需求。首先,程序的主線程也就是程序的入口即Main()函數, 
  15.          * 當執行到Accept方法時,線程變會阻塞;當有新連接時,就創建相應的消息服務線程。而主程序則繼續進行監聽, 
  16.          * 檢查有沒有新的連接進入。如果客戶端有向服務器連接的請求,那么就把連接句柄傳遞給接收的套接字。由於線程 
  17.          * 的調度和切換是非常快的,快得足以讓我們分辨不出程序的運行順序,所以從宏觀上來講,可以說程序是並行執行 
  18.          * 的。但事實上,從微觀的角度上說,只是cpu飛快地調度線程,讓我們感覺好像可以同時接收連接和處理消息一樣, 
  19.          * 但在一個時刻,只有一個線程是處於運行狀態的。 
  20.          */  
  21.   
  22.   
  23.         /// <summary>  
  24.         /// 下面這段代碼的業務邏輯是:  
  25.         /// (1)創建套接字server,並將其與本地終結點iep進行綁定。然后,在13000端口上監聽是否  
  26.                   有新的客戶端進行連接  
  27.         /// (2)在無限循環中有一個阻塞的方法Accept,該方法直到有新客戶端連接到服務器上時,把  
  28.                   客戶端的套接字信息傳遞給client對象。否則,將阻塞 直到有客戶機進行連接。  
  29.         /// (3)ClientThread類負責客戶端與服務器端之間的通信。先把客戶端的套接字句柄傳遞給  
  30.         ///       負責消息服務的ClientThread類。然后,把ClientThread類 的ClientService方  
  31.                   法委托給線程,並啟動線程。   
  32.         /// </summary>  
  33.         private Socket server;  
  34.         public Threadtcpserver()  
  35.         {  
  36.             //初始化IP地址  
  37.             IPAddress local=IPAddress.Parse("192.168.5.187");  
  38.             IPEndPoint iep = new IPEndPoint(local, 13000);  
  39.             server = new Socket(AddressFamily.InterNetwork, SocketType.Stream,  
  40.             ProtocolType.Tcp);  
  41.             //將套接字與本地終結點綁定  
  42.             server.Bind(iep);  
  43.             //在本地13000端口號上進行監聽  
  44.             server.Listen(20);  
  45.             Console.WriteLine("等待客戶機進行連接......");  
  46.             while (true)  
  47.             {  
  48.                 //得到包含客戶端信息的套接字  
  49.                 Socket client = server.Accept();  
  50.                 //創建消息服務線程對象  
  51.                 ClientThread newclient = new ClientThread(client);  
  52.                 //把ClientThread類的ClientService方法委托給線程  
  53.                 Thread newthread = new Thread(new ThreadStart(newclient.ClientService));  
  54.                 //啟動消息服務線程  
  55.                 newthread.Start();  
  56.                        
  57.             }  
  58.   
  59.   
  60.         }  
  61.   
  62.   
  63.         /// <summary>  
  64.         /// (1)在構造函數中得到接收到的客戶套接字client,以后就通過service句柄處理消息的接收  
  65.          ///      和發送。  
  66.         /// (2)ClientService方法是委托給線程的,此方法進行消息的處理工作。在這里實現的功能是,  
  67.         ///       先從客戶端接收一條消息,然后把這條消息轉換為大寫字母,並立即發送一條應答的消息,  
  68.         ///      也就是所謂的echo技術,通常用來進行消息之間的傳遞。  
  69.         /// (3)還有就是通過connections變量來記錄活動的連接數。當有新增連接或斷開連接的情況發   
  70.         ///       生時,都會體現出connections的變化。  
  71.        /// </summary>  
  72.         public class ClientThread  
  73.         {  
  74.             //connections變量表示連接數  
  75.             public static int connections = 0;  
  76.             public Socket service;  
  77.             int i;  
  78.             //構造函數  
  79.             public ClientThread(Socket clientsocket)  
  80.             {  
  81.                 //service對象接管對消息的控制  
  82.                 this.service = clientsocket;  
  83.             }  
  84.             public void ClientService()  
  85.             {  
  86.                 String data = null;  
  87.                 byte[] bytes = new byte[1024];  
  88.                 //如果Socket不是空,則連接數加1  
  89.                 if (service != null)  
  90.                 {  
  91.                     connections++;  
  92.                 }  
  93.                 Console.WriteLine("新客戶連接建立:{0}個連接數", connections);  
  94.                 while((i=service.Receive(bytes))!=0)  
  95.                 {  
  96.                     data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);  
  97.                     Console.WriteLine("收到的數據:{0}", data);  
  98.                     //處理客戶端發來的消息,這是轉化為大寫字母  
  99.                     data = data.ToUpper();  
  100.                     byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);  
  101.                     //發送一條應答消息  
  102.                     service.Send(msg);  
  103.                     Console.WriteLine("發送的數據:{0}", data);  
  104.                 }  
  105.                 //關閉套接字  
  106.                 service.Close();  
  107.                 connections--;  
  108.                 Console.WriteLine("客戶關閉連接:{0}個連接數", connections);  
  109.             }  
  110.   
  111.   
  112.             /// <summary>  
  113.             /// Main函數十分簡單,生成和一個Threadtcpserver實例,然后構造函數就會一步一步地  
  114.               /// 展開,開始執行具體的業務邏輯。  
  115.             /// </summary>  
  116.             /// <param name="args"></param>  
  117.             static void Main(string[] args)  
  118.             {  
  119.                 Threadtcpserver instance = new Threadtcpserver();  
  120.             }  
  121.   
  122.   
  123.         }  
  124.               
  125.   
  126.   
  127.   
  128.   
  129.   
  130.   
  131.   
  132.   
  133.           
  134.     }  
  135. }  

 

 

客戶端代碼:

[c-sharp]
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Net;  
  6. using System.Net.Sockets;  
  7.   
  8.   
  9. namespace multithreadclientTest  
  10. {  
  11.     class Program  
  12.     {  
  13.         /// <summary>  
  14.         /// 本程序代碼的主要功能:  
  15.         /// (1)創建套接字,並通過connect方法連接到本地終結點。當連接建立以后,便可以與服務器進  
  16.         ///       行通訊了。  
  17.         /// (2)在客戶端上等待用戶輸入一條消息,該消息會發送到服務器創建的消息服務線程上  
  18.         ///       的ClientService 方法上進行處理。在將該消息轉化為大寫字母后,發還給客戶端。  
  19.         ///       這是一個echo技術。如果在控制台上輸入exit 接斷開與服務器之間的連接。  
  20.         /// </summary>  
  21.         /// <param name="args"></param>  
  22.         static void Main(string[] args)  
  23.         {  
  24.             Socket client;  
  25.             byte[] buf = new byte[1024];  
  26.             string input;  
  27.             IPAddress local = IPAddress.Parse("192.168.5.187");  
  28.             IPEndPoint iep = new IPEndPoint(local, 13000);  
  29.   
  30.             try  
  31.             {  
  32.                 client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,  
  33.                 ProtocolType.Tcp);  
  34.                 client.Connect(iep);  
  35.             }  
  36.             catch (SocketException)  
  37.             {  
  38.                 Console.WriteLine("無法連接到服務器!");  
  39.                 return;  
  40.             }  
  41.             finally  
  42.             {  
  43.   
  44.             }  
  45.             while (true)  
  46.             {  
  47.                 //在控制台上輸入一條消息  
  48.                 input = Console.ReadLine();  
  49.                 //輸入exit,可以斷開與服務器的連接  
  50.                 if (input == "exit")  
  51.                 {  
  52.                     break;  
  53.                 }  
  54.                 client.Send(Encoding.ASCII.GetBytes(input));  
  55.                 //得到實際收到的字節總數  
  56.                 int rec = client.Receive(buf);  
  57.                 Console.WriteLine(Encoding.ASCII.GetString(buf, 0, rec));  
  58.   
  59.             }  
  60.             Console.WriteLine("斷開與服務器的連接......");  
  61.             client.Close();  
  62.   
  63.   
  64.         }  
  65.     }  

 

程序執行部分截圖:

 

客戶端1

 

客戶端2

 

 

服務器端

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM