1. 程式人生 > >C#Socket多執行緒通訊(聊天室)

C#Socket多執行緒通訊(聊天室)

網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket

一般有兩個端,一個伺服器端(ServerScoket)一個客戶端(ClientSocket)

Socket是tcp\ip網路協議介面。內部定義了許多的函式和例程。可以看成是網路通訊的一個端點

Socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求。

相信看這篇部落格的朋友應該已經對socket通訊有了初步的瞭解了吧,沒了解的可以自行百度一下,這裡不多做介紹了。

伺服器與客戶端是如何通訊的呢,

其實就是伺服器serversocket套接字,客戶端clientsocket分別其本機ip地址與一個埠號

繫結進行連線,連線成功後客戶端就可以給伺服器端傳送訊息了,伺服器將資訊儲存下來,進行處理(傳送給其他客戶端或者傳送回去)。

那麼利用Socket多執行緒通訊如何實現多人通訊(聊天室)呢?

我是這樣理解的,

伺服器端:

1.先建立socketserver套接字,監聽是否有客戶端連線。

2.待某個客戶端連線上時,將客戶端client加入到Socket型別的陣列clientsockets裡,客戶端數量自加socketNum++。

3.建立一個執行緒,和這個客戶端通訊(接收這個客戶端傳送的訊息)。

4.將這個客戶端傳送的訊息傳送給全部

1.先建立socketserver套接字,監聽是否有客戶端連線。

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("172.20.0.229"), 6666);
            socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
            socketServer.Bind(ipep);
            socketServer.Listen(10);
            Console.WriteLine("等待客戶端連線");

2.待某個客戶端連線上時,將客戶端client加入到Socket型別的陣列clientsockets裡,客戶端數量自加socketNum++。

建立Socket型別的陣列clientsockets

private Socket[] clientsockets = new Socket[40];
將客戶端client加入到Socket型別的陣列clientsockets裡,客戶端數量自加socketNum++
Socket client  = socketServer.Accept();
                Console.WriteLine("連線成功");
                clientsockets[socketNum++] = client;
3.建立一個執行緒,和這個客戶端通訊(接收這個客戶端傳送的訊息).

1.建立一個執行緒

  Thread th = new Thread(new ParameterizedThreadStart (ReceiveData));
                //建立一個執行緒,和這個客戶端通訊(接收客戶端傳來的資訊)
                //建立了一個ParameterizedThreadStart委託,指明執行緒的入口方法為ReceiveData
                th.Start(client);
                //讓伺服器與這客戶端之間的執行緒跑起來,
                //提供包含執行執行緒方法ReceiveData要使用的資料物件client
2.和這個客戶端通訊(接收這個客戶端傳送的訊息)
private void ReceiveData(object client)
         {
             Socket nowClient = (Socket)client;
             //不斷接收客戶端傳來的訊息,併發送給其他客戶端
             while (true)
             {
                 int bytes = 0;
                 byte[] data = new byte[1024];
                 try
                 {
                     bytes = nowClient.Receive(data);//接收客戶端傳來的訊息
                 }
                 catch (Exception e)
                 {
                     Console.WriteLine(e.ToString());
                 }
                 string message = Encoding.UTF8.GetString(data, 0, bytes);
                 data = Encoding.UTF8.GetBytes(message);
                 SendAll(data);
                 //將訊息傳送到其他客戶端
             }
         }

4.將這個客戶端傳送的訊息傳送給其他客戶端

 public void SendAll(byte[] data )
         {
             //使用迴圈向colientsockets陣列中的每一個客戶端傳送訊息
             for (int i = 0; i < socketNum ; i++)
             {
                 clientsockets[i].Send(data);   
             }
         }

客戶端

1.先建立client套接字,連線伺服器端。

2.連線成功後,建立一個執行緒,來接收伺服器發來的訊息。

3.向伺服器傳送訊息(聊天)。

1.先建立client套接字,連線伺服器端。

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("172.20.0.229"), 6666);
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                client.Connect(ipep);
                //連線伺服器成功

            }
            catch (SocketException e)
            {
                Console.WriteLine(e.ToString());
            }
            Console.WriteLine("連線伺服器成功,請輸入暱稱");
     

2.連線成功後,建立一個執行緒,來接收伺服器發來的訊息。
Thread newthread = new Thread(new ThreadStart(ReceiveData));
            newthread.Start();

3.向伺服器傳送訊息(聊天)。
 byte[] data1 = new byte[1024];
            //發訊息給伺服器端
            while (true)
            {
                string input = Console.ReadLine();
                input = name + input;
                data1 = Encoding.UTF8.GetBytes(input);
                client.Send(data1);
            }
            client.Close ();
            Console.ReadLine ();