這篇文章將為大家詳細(xì)講解有關(guān)C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信的方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
10年積累的網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有石棉免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
擴(kuò)展:
由于server端是存儲(chǔ)了所有server與client的連接對(duì)象,因此我們是可以基于此demo的基礎(chǔ)上實(shí)現(xiàn)聊天系統(tǒng):
* 每當(dāng)一個(gè)與用戶發(fā)言時(shí),是由server接收到的某個(gè)用戶的發(fā)言信息的,此時(shí)服務(wù)器端可以通過循環(huán)發(fā)送該用戶發(fā)送的信息給每個(gè)已經(jīng)連接連接的用戶(排除發(fā)送者)。
Server端代碼:
class Program { //創(chuàng)建一個(gè)和客戶端通信的套接字 static Socket SocketWatch = null; //定義一個(gè)集合,存儲(chǔ)客戶端信息 static Dictionary<string, Socket> ClientConnectionItems = new Dictionary<string, Socket> { }; static void Main(string[] args) { //端口號(hào)(用來監(jiān)聽的) int port = 6000; //string host = "127.0.0.1"; //IPAddress ip = IPAddress.Parse(host); IPAddress ip = IPAddress.Any; //將IP地址和端口號(hào)綁定到網(wǎng)絡(luò)節(jié)點(diǎn)point上 IPEndPoint ipe = new IPEndPoint(ip, port); //定義一個(gè)套接字用于監(jiān)聽客戶端發(fā)來的消息,包含三個(gè)參數(shù)(IP4尋址協(xié)議,流式連接,Tcp協(xié)議) SocketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //監(jiān)聽綁定的網(wǎng)絡(luò)節(jié)點(diǎn) SocketWatch.Bind(ipe); //將套接字的監(jiān)聽隊(duì)列長度限制為20 SocketWatch.Listen(20); //負(fù)責(zé)監(jiān)聽客戶端的線程:創(chuàng)建一個(gè)監(jiān)聽線程 Thread threadwatch = new Thread(WatchConnecting); //將窗體線程設(shè)置為與后臺(tái)同步,隨著主線程結(jié)束而結(jié)束 threadwatch.IsBackground = true; //啟動(dòng)線程 threadwatch.Start(); Console.WriteLine("開啟監(jiān)聽......"); Console.WriteLine("點(diǎn)擊輸入任意數(shù)據(jù)回車退出程序......"); Console.ReadKey(); SocketWatch.Close(); //Socket serverSocket = null; //int i=1; //while (true) //{ // //receive message // serverSocket = SocketWatch.Accept(); // Console.WriteLine("連接已經(jīng)建立!"); // string recStr = ""; // byte[] recByte = new byte[4096]; // int bytes = serverSocket.Receive(recByte, recByte.Length, 0); // //recStr += Encoding.ASCII.GetString(recByte, 0, bytes); // recStr += Encoding.GetEncoding("utf-8").GetString(recByte, 0, bytes); // //send message // Console.WriteLine(recStr); // Console.Write("請(qǐng)輸入內(nèi)容:"); // string sendStr = Console.ReadLine(); // //byte[] sendByte = Encoding.ASCII.GetBytes(sendStr); // byte[] sendByte = Encoding.GetEncoding("utf-8").GetBytes(sendStr); // //Thread.Sleep(4000); // serverSocket.Send(sendByte, sendByte.Length, 0); // serverSocket.Close(); // if (i >= 100) // { // break; // } // i++; //} //sSocket.Close(); //Console.WriteLine("連接關(guān)閉!"); //Console.ReadLine(); } //監(jiān)聽客戶端發(fā)來的請(qǐng)求 static void WatchConnecting() { Socket connection = null; //持續(xù)不斷監(jiān)聽客戶端發(fā)來的請(qǐng)求 while (true) { try { connection = SocketWatch.Accept(); } catch (Exception ex) { //提示套接字監(jiān)聽異常 Console.WriteLine(ex.Message); break; } //客戶端網(wǎng)絡(luò)結(jié)點(diǎn)號(hào) string remoteEndPoint = connection.RemoteEndPoint.ToString(); //添加客戶端信息 ClientConnectionItems.Add(remoteEndPoint, connection); //顯示與客戶端連接情況 Console.WriteLine("\r\n[客戶端\"" + remoteEndPoint + "\"建立連接成功! 客戶端數(shù)量:" + ClientConnectionItems .Count+ "]"); //獲取客戶端的IP和端口號(hào) IPAddress clientIP = (connection.RemoteEndPoint as IPEndPoint).Address; int clientPort = (connection.RemoteEndPoint as IPEndPoint).Port; //讓客戶顯示"連接成功的"的信息 string sendmsg = "[" + "本地IP:" + clientIP + " 本地端口:" + clientPort.ToString() + " 連接服務(wù)端成功!]"; byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendmsg); connection.Send(arrSendMsg); //創(chuàng)建一個(gè)通信線程 Thread thread = new Thread(recv); //設(shè)置為后臺(tái)線程,隨著主線程退出而退出 thread.IsBackground = true; //啟動(dòng)線程 thread.Start(connection); } } /// <summary> /// 接收客戶端發(fā)來的信息,客戶端套接字對(duì)象 /// </summary> /// <param name="socketclientpara"></param> static void recv(object socketclientpara) { Socket socketServer = socketclientpara as Socket; while (true) { //創(chuàng)建一個(gè)內(nèi)存緩沖區(qū),其大小為1024*1024字節(jié) 即1M byte[] arrServerRecMsg = new byte[1024 * 1024]; //將接收到的信息存入到內(nèi)存緩沖區(qū),并返回其字節(jié)數(shù)組的長度 try { int length = socketServer.Receive(arrServerRecMsg); //將機(jī)器接受到的字節(jié)數(shù)組轉(zhuǎn)換為人可以讀懂的字符串 string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length); //將發(fā)送的字符串信息附加到文本框txtMsg上 Console.WriteLine("\r\n[客戶端:" + socketServer.RemoteEndPoint + " 時(shí)間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")+ "]\r\n" + strSRecMsg); //Thread.Sleep(3000); //socketServer.Send(Encoding.UTF8.GetBytes("[" + socketServer.RemoteEndPoint + "]:"+strSRecMsg)); //發(fā)送客戶端數(shù)據(jù) if (ClientConnectionItems.Count > 0) { foreach (var socketTemp in ClientConnectionItems) { socketTemp.Value.Send(Encoding.UTF8.GetBytes("[" + socketServer.RemoteEndPoint + "]:" + strSRecMsg)); } } } catch (Exception) { ClientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString()); //提示套接字監(jiān)聽異常 Console.WriteLine("\r\n[客戶端\"" + socketServer.RemoteEndPoint + "\"已經(jīng)中斷連接! 客戶端數(shù)量:" + ClientConnectionItems.Count+"]"); //關(guān)閉之前accept出來的和客戶端進(jìn)行通信的套接字 socketServer.Close(); break; } } } }
Client端代碼:
class Program { //創(chuàng)建1個(gè)客戶端套接字和1個(gè)負(fù)責(zé)監(jiān)聽服務(wù)端請(qǐng)求的線程 static Thread ThreadClient = null; static Socket SocketClient = null; static void Main(string[] args) { try { int port = 6000; string host = "127.0.0.1";//服務(wù)器端ip地址 IPAddress ip = IPAddress.Parse(host); IPEndPoint ipe = new IPEndPoint(ip, port); //定義一個(gè)套接字監(jiān)聽 SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { //客戶端套接字連接到網(wǎng)絡(luò)節(jié)點(diǎn)上,用的是Connect SocketClient.Connect(ipe); } catch (Exception) { Console.WriteLine("連接失敗!\r\n"); Console.ReadLine(); return; } ThreadClient = new Thread(Recv); ThreadClient.IsBackground = true; ThreadClient.Start(); Thread.Sleep(1000); Console.WriteLine("請(qǐng)輸入內(nèi)容<按Enter鍵發(fā)送>:\r\n"); while(true) { string sendStr = Console.ReadLine(); ClientSendMsg(sendStr); } //int i = 1; //while (true) //{ // Console.Write("請(qǐng)輸入內(nèi)容:"); // string sendStr = Console.ReadLine(); // Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // clientSocket.Connect(ipe); // //send message // //byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr); // byte[] sendBytes = Encoding.GetEncoding("utf-8").GetBytes(sendStr); // //Thread.Sleep(4000); // clientSocket.Send(sendBytes); // //receive message // string recStr = ""; // byte[] recBytes = new byte[4096]; // int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0); // //recStr += Encoding.ASCII.GetString(recBytes, 0, bytes); // recStr += Encoding.GetEncoding("utf-8").GetString(recBytes, 0, bytes); // Console.WriteLine(recStr); // clientSocket.Close(); // if (i >= 100) // { // break; // } // i++; //} //Console.ReadLine(); //return; //string result = String.Empty; } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadLine(); } } //接收服務(wù)端發(fā)來信息的方法 public static void Recv() { int x = 0; //持續(xù)監(jiān)聽服務(wù)端發(fā)來的消息 while (true) { try { //定義一個(gè)1M的內(nèi)存緩沖區(qū),用于臨時(shí)性存儲(chǔ)接收到的消息 byte[] arrRecvmsg = new byte[1024 * 1024]; //將客戶端套接字接收到的數(shù)據(jù)存入內(nèi)存緩沖區(qū),并獲取長度 int length = SocketClient.Receive(arrRecvmsg); //將套接字獲取到的字符數(shù)組轉(zhuǎn)換為人可以看懂的字符串 string strRevMsg = Encoding.UTF8.GetString(arrRecvmsg, 0, length); if (x == 1) { Console.WriteLine("\r\n服務(wù)器:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n" + strRevMsg+"\r\n"); } else { Console.WriteLine(strRevMsg + "\r\n"); x = 1; } } catch (Exception ex) { Console.WriteLine("遠(yuǎn)程服務(wù)器已經(jīng)中斷連接!" + ex.Message + "\r\n"); break; } } } //發(fā)送字符信息到服務(wù)端的方法 public static void ClientSendMsg(string sendMsg) { //將輸入的內(nèi)容字符串轉(zhuǎn)換為機(jī)器可以識(shí)別的字節(jié)數(shù)組 byte[] arrClientSendMsg = Encoding.UTF8.GetBytes(sendMsg); //調(diào)用客戶端套接字發(fā)送字節(jié)數(shù)組 SocketClient.Send(arrClientSendMsg); } }
測試結(jié)果:
server端:
client端:
關(guān)于“C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
新聞名稱:C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信的方法
網(wǎng)站URL:http://www.rwnh.cn/article8/ghchop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站排名、App開發(fā)、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)