一,服務端代碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; namespace ServerDemo1 { class Program { static List<Client> clientList = new List<Client>(); /// <summary> /// 廣播消息 /// </summary> /// <param name="message"></param> public static void BroadcastMessage(string message) //找到相對應的客戶端發送消息 { var notConnectedList = new List<Client>(); foreach (var client in clientList) { if (client.Connected) client.SendMessage(message); //調用服務端發送消息方法 else { notConnectedList.Add(client); } } foreach (var temp in notConnectedList) { clientList.Remove(temp); } } static void Main(string[] args) { Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); tcpServer.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888)); tcpServer.Listen(100); Console.WriteLine("server running..."); while (true) { Socket clientSocket = tcpServer.Accept(); clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello")); Console.WriteLine("a client is connected !"); Client client = new Client(clientSocket); //把與每個客戶端通信的邏輯(收發消息)放到client類里面進行處理 clientList.Add(client); } } } }
處理數據類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net.Sockets; namespace ServerDemo1 { /// <summary> /// 用來跟客戶端做通信 /// </summary> class Client { private Socket clientSocket; private Thread t; private byte[] data = new byte[1024];//這個是一個數據容器 public Client(Socket s) { clientSocket = s; //啟動一個線程 處理客戶端的數據接收 t = new Thread(ReceiveMessage); t.Start(); } private void ReceiveMessage() { //一直接收客戶端的數據 while (true) { //在接收數據之前 判斷一下socket連接是否斷開 if (clientSocket.Poll(10, SelectMode.SelectRead)) { clientSocket.Close(); break;//跳出循環 終止線程的執行 } int length = clientSocket.Receive(data); string message = Encoding.UTF8.GetString(data, 0, length); //接收到數據的時候 要把這個數據 分發到客戶端 //廣播這個消息 Program.BroadcastMessage(message); Console.WriteLine("收到了消息:" + message); } } public void SendMessage(string message) { byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); //將客戶端發送過來的消息返回給服務端 } public bool Connected { get { return clientSocket.Connected; } } } }
客戶端代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; namespace ClientDemo { class Program { private static byte[] result = new byte[1024]; static void Main(string[] args) { //設定服務器IP地址 IPAddress ip = IPAddress.Parse("127.0.0.1"); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { clientSocket.Connect(new IPEndPoint(ip, 8888)); //配置服務器IP與端口 Console.WriteLine("連接服務器成功"); } catch { Console.WriteLine("連接服務器失敗,請按回車鍵退出!"); return; } //通過clientSocket接收數據 int receiveLength = clientSocket.Receive(result); Console.WriteLine("接收服務器消息:{0}", Encoding.ASCII.GetString(result, 0, receiveLength)); //通過 clientSocket 發送數據 string str = ""; while (str != "exit") { try { Thread.Sleep(1000); //等待1秒鍾 Console.WriteLine("向服務器發送消息:"); str = Console.ReadLine(); clientSocket.Send(Encoding.ASCII.GetBytes(str + " " + DateTime.Now+"1")); int receiveL = clientSocket.Receive(result); Console.WriteLine("接收服務器消息:{0}", Encoding.ASCII.GetString(result, 0, receiveL)); } catch { clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); break; } } Console.ReadKey(); } } }