需要引用using System.Net.Sockets; using System.Net;兩個(gè)命名空間;
namespace TcpServer //服務(wù)器
{
class Program
{
public static List<Client> clientList = new List<Client>();
static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創(chuàng)建socket對(duì)象
tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 8090));//綁定IP和申請(qǐng)端口
tcpServer.Listen(100);//設(shè)置客戶(hù)端最大連接數(shù)
Console.WriteLine("服務(wù)器已啟動(dòng),等待連接.........");
while (true)//循環(huán)等待新客戶(hù)端的連接
{
Socket clientSocket = tcpServer.Accept();
Console.WriteLine((clientSocket.RemoteEndPoint as IPEndPoint).Address+"已連接");
Client client = new Client(clientSocket);
clientList.Add(client);
}
}
public static void BroadcastMessage(string message, Client clientSocket)//這個(gè)函數(shù)用來(lái)廣播接收到的客戶(hù)端消息 參數(shù)1為消息,參數(shù)2為消息來(lái)源(客戶(hù)端)
{
var onConnectedList = new List<Client>();//用來(lái)存儲(chǔ)已斷開(kāi)服務(wù)器連接的客戶(hù)端
foreach (var client in clientList)//遍歷已經(jīng)存儲(chǔ)的客戶(hù)端
{
if (clientSocket == client)//如果該客戶(hù)端是消息來(lái)源,則不重復(fù)發(fā)送消息給該客戶(hù)端
{
continue;
}
if (client.Connected)//判斷該客戶(hù)端的狀態(tài)
{
client.SendMessage(client.ip + ":" + message);//
}
else//把已斷開(kāi)連接的客戶(hù)端放到數(shù)組中
{
onConnectedList.Add(client);
}
}
foreach (var temp in onConnectedList)//廣播完之后從存儲(chǔ)已連接客戶(hù)端集合中移除掉已斷開(kāi)連接的客戶(hù)端
{
clientList.Remove(temp);
}
}
}
}
namespace TcpServer
{
class Client
{
private Socket clientSocket;
private Thread t;
public string ip = "";
private byte[] data = new byte[1024];
public Client(Socket socket)
{
clientSocket = socket;
ip = (clientSocket.RemoteEndPoint as IPEndPoint).Address.ToString();//獲取客戶(hù)端的ip
t = new Thread(ReceiveMessage);//開(kāi)啟線(xiàn)程執(zhí)行循環(huán)接收消息
t.Start();
}
private void ReceiveMessage()//接收消息
{
int length = 0;//初始化消息的長(zhǎng)度
while (true)//循環(huán)接收消息
{
length = clientSocket.Receive(data);//獲取存放消息數(shù)據(jù)數(shù)組的長(zhǎng)度
if (clientSocket.Poll(10, SelectMode.SelectRead))//????
{
clientSocket.Close();
break;
}
if (length != 0)//判斷是否有數(shù)組內(nèi)是否存放消息數(shù)據(jù)
{
string message = Encoding.UTF8.GetString(data, 0, length);//Byte轉(zhuǎn)為string
Program.BroadcastMessage(message, this);//廣播給其他客戶(hù)端
Console.WriteLine("來(lái)自" + (clientSocket.RemoteEndPoint as IPEndPoint).Address + ":" + message);//輸出到服務(wù)器控制臺(tái)
length = 0;//歸0
}
}
}
public void SendMessage(string message)//發(fā)送消息
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
public bool Connected//獲取該客戶(hù)端的狀態(tài)
{
get { return clientSocket.Connected; }
}
}
}

image.png