服務端:
using System.Text; using System.Threading; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; namespace SocketUDP_Server { /// <summary> /// 服務端 /// </summary> class Program { private static int Port = 8848; private static Socket socket; private static IPEndPoint ServerIPPort; //服務器偵聽的IP范圍和端口 private static List<IPEndPoint> ClientPoints = new List<IPEndPoint>(); //所有和服務器鏈接的客戶端 private static void Main(string[] args) { ServerIPPort = new IPEndPoint(IPAddress.Any, Port); //服務器偵聽所有IP和本機8848端口 //定義套接字類型,在主線程中定義 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //Socket綁定服務器端 socket.Bind(ServerIPPort); Console.WriteLine("服務器初始化完成..."); Thread ReceiveClient = new Thread(SocketReceive); ReceiveClient.Start(); Console.ReadKey(); } /// <summary> /// 服務器持續接收信息 /// </summary> private static void SocketReceive() { //進入接收循環 while (true) { //定義字節組並且設定長度 byte[] recvData = new byte[1024]; //recvData的臨時長度 int recvDataLength = 0; IPEndPoint ClientTemp = new IPEndPoint(IPAddress.Any, 0); //初始化一個臨時的客戶端類 EndPoint Client = (EndPoint)ClientTemp; //鏈接到服務器的客戶端(臨時的) recvDataLength = socket.ReceiveFrom(recvData, ref Client); //ReceiveFrom偵聽方法 addToClientPoints((IPEndPoint)Client); //輸出接收到的數據 string TempStr = Encoding.UTF8.GetString(recvData, 0, recvDataLength); Console.WriteLine("客戶端-" + Client.ToString() + ":"+ TempStr); //向其它客戶端進行信息廣播 sendToAllClient((IPEndPoint)Client, Encoding.UTF8.GetBytes(Client.ToString() + ":" + TempStr)); //Console.WriteLine(ClientPoints.Count); } } /// <summary> /// 添加到客戶端集合邏輯 /// </summary> private static void addToClientPoints(IPEndPoint Client) { //通過字符串判斷是否和現有的"IPEndPoint"重復 bool key = true; for (int i = 0; i < ClientPoints.Count; i++) { if(ClientPoints[i].ToString() == Client.ToString()) { key = false; break; } } if(key == true) { ClientPoints.Add(Client); } //遍歷所有鏈接到的客戶端信息 //for (int i = 0; i < ClientPoints.Count; i++) //{ // Console.WriteLine(ClientPoints[i].ToString()); //} } /// <summary> /// 給所有客戶端發送信息 /// </summary> /// <param name="Client">發出此信息的客戶端(避免給此客戶端發送信息)</param> private static void sendToAllClient(IPEndPoint Client, byte[] messageByte) { for (int i = 0; i < ClientPoints.Count; i++) { if (ClientPoints[i].ToString() != Client.ToString()) { socket.SendTo(messageByte, messageByte.Length, SocketFlags.None, ClientPoints[i]); //Console.WriteLine("轉送了"); } } } } }
客戶端:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; namespace SocketUDP_Client { /// <summary> /// 客戶端 /// </summary> class Program { private static IPAddress IP = IPAddress.Parse("62.234.48.162"); //private static IPAddress IP = IPAddress.Parse("127.0.0.1"); private static int Port = 8848; private static Socket socket; private static IPEndPoint ServerIPPort; //服務器偵聽的IP范圍和端口 private static IPEndPoint ClientReceiveIPPort; //客戶端偵聽服務器 private static EndPoint Client; private static void Main(string[] args) { //初始化Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //連接服務器的IP和端口 ServerIPPort = new IPEndPoint(IP, Port); //服務器的地址端 ClientReceiveIPPort = new IPEndPoint(IPAddress.Any, 0); Client = (EndPoint)ClientReceiveIPPort; //綁定服務端(客戶端只接收服務端發來的信息) socket.Bind(Client); Console.WriteLine("請輸入需要發送的信息: ↓"); //Console.WriteLine(socket.LocalEndPoint.ToString()); Thread SendToServer = new Thread(LoopSendMessage); SendToServer.Start(); Thread ReceiveToServer = new Thread(SocketReceive); ReceiveToServer.Start(); Console.ReadKey(); } /// <summary> /// 客戶端接收服務器發來的其它客戶端信息 /// </summary> private static void SocketReceive() { //進入接收循環 while (true) { //定義字節組並且設定長度 byte[] recvData = new byte[1024]; //recvData的臨時長度 int recvDataLength = 0; try { recvDataLength = socket.ReceiveFrom(recvData, ref Client); //ReceiveFrom偵聽方法 } catch { Console.WriteLine("與服務器斷開鏈接!!!"); } //輸出接收到的數據 string TempStr = Encoding.UTF8.GetString(recvData, 0, recvDataLength); Console.WriteLine(TempStr); } } /// <summary> /// 循環發送信息 /// </summary> private static void LoopSendMessage() { //客戶端首次向服務器發送信息 SendMessage("上線了"); while (true) { string tempMessage = Console.ReadLine(); SendMessage(tempMessage); } } /// <summary> /// 向服務器發送信息 /// </summary> private static void SendMessage(string message) { //定義要發送的字節組及長度 byte[] messageByte = new byte[1024]; //講字符串轉換成字節組 messageByte = Encoding.UTF8.GetBytes(message); //發送到知道的服務器 socket.SendTo(messageByte, messageByte.Length, SocketFlags.None, ServerIPPort); } } }