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