<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        C#利用服務器實現客戶端之間通信

        來源:懂視網 責編:小采 時間:2020-11-27 22:36:36
        文檔

        C#利用服務器實現客戶端之間通信

        C#利用服務器實現客戶端之間通信:先來講述下我自己對于整個Socket通信過程的理解,畢竟初學,說錯見諒,知道錯了會改正~ 首先在服務端新建一個serverSocket,對其進行初始化(一般包含AddressFamily:IP地址類型,SocketType:Socket傳輸數據方式,ProtoType:傳輸協議); 接
        推薦度:
        導讀C#利用服務器實現客戶端之間通信:先來講述下我自己對于整個Socket通信過程的理解,畢竟初學,說錯見諒,知道錯了會改正~ 首先在服務端新建一個serverSocket,對其進行初始化(一般包含AddressFamily:IP地址類型,SocketType:Socket傳輸數據方式,ProtoType:傳輸協議); 接

        先來講述下我自己對于整個Socket通信過程的理解,畢竟初學,說錯見諒,知道錯了會改正~ 

        首先在服務端新建一個serverSocket,對其進行初始化(一般包含AddressFamily:IP地址類型,SocketType:Socket傳輸數據方式,ProtoType:傳輸協議); 

        接著我們要設置server端要綁定的IP:port;然后開始監聽,并設置最多同時監聽多少個Client.

        這時,服務端就在等待狀態,直到某一個Client連接到這個ip:port上,這時serverSocket.Accept()工作,獲得這個連接。(此時的連接是有地址信息的哦!記得保存) 

        獲得連接之后,server就可以和這個Client進行通信了,當加入第二個Client(我們稱其為ClientB)時,Server接收到ClientB的消息,可以將這個消息轉發給前一個Client(我們稱其為ClientA),當受到ClientA的消息,也可以轉發給ClientB。這樣就實現了Clients之間的通信了。(重點在保存連接信息?。。?br />

        那么現在貼上代碼講解:

        Server端代碼 

        namespace SocketServer
        {
         class Program
         {
         private static byte[] result = new byte[1024];
         
         static Socket serverSocket;
         private static string client;
         private static Socket clientSocket;
         //我這里存了兩個Client,因為自己電腦開了兩個Client,不會有多的
         //理論上應該開一個Socket[]來保存信息,最好用一個二元組將client的信息和連接綁定起來
         //這樣就可以實現斷開連接后下次登陸還是可以識別是這個Client
         private static Socket clientSocketA=null;
         private static Socket clientSocketB=null;
         
         static void Main(string[] args)
         {
         Program.SetPort(8885);
         }
         private static void SetPort(int port)
         {
         IPAddress ip = IPAddress.Parse("127.0.0.1");//set ip
         serverSocket = new Socket(AddressFamily.InterNetwork,
         SocketType.Stream, ProtocolType.Tcp);//initialize
         serverSocket.Bind(new IPEndPoint(ip, port));//bind
         serverSocket.Listen(10);
         //進入監聽狀態
         Console.WriteLine("監聽{0}成功", serverSocket.LocalEndPoint.ToString());
         //開啟一個線程來監聽客戶端連接
         Thread myThread = new Thread(ListenClientConnect);
         myThread.Start();
         Console.ReadLine();
        
         }
         /// <summary>
         /// 監聽客戶端連接
         /// </summary>
         private static void ListenClientConnect()
         {
         while (true)
         {
         //Client連接上后 得到這個連接
         clientSocket = serverSocket.Accept();
        
         //這里我因為只有兩個Client,所以就簡單寫了
         if (clientSocketA == null)
         {
         clientSocketA = clientSocket;
         }
         else if (clientSocketB == null)
         {
         clientSocketB = clientSocket;
         }
         else
         {
         //當其中一個斷開了,又重新連接時,需要再次保存連接
         if (clientSocketB.IsBound)
         {
         clientSocketA = clientSocketB;
         clientSocketB = clientSocket;
         }
         else
         {
         clientSocketB = clientSocketA;
         clientSocketA = clientSocket;
         }
         
         }
         clientSocket.Send(Encoding.ASCII.GetBytes("say hello"));
         //開個線程接收Client信息
         Thread receivedThread = new Thread(ReceiveMessage);
         receivedThread.Start(clientSocket);
        
         }
         }
         
         private static void ReceiveMessage(object clientSocket)
         {
         Socket myClientSocket = (Socket) clientSocket;
         
         while (true)
         {
         try
         {
         int revceiveNumber = myClientSocket.Receive(result);
         //Console.WriteLine("接受客戶端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString()
         // , Encoding.ASCII.GetString(result, 0, revceiveNumber));
         Console.WriteLine(Encoding.ASCII.GetString(result, 0, revceiveNumber));
         if (myClientSocket == clientSocketA)
         {
         Console.WriteLine("receive from A");
         if (clientSocketB!=null&&clientSocketB.IsBound)
         {
         Console.WriteLine("a IS BOUND");
         clientSocketB.Send(result, 0, revceiveNumber, SocketFlags.None);
         }
         else
         {
         myClientSocket.Send(Encoding.ASCII.GetBytes("the people is not online! Send Failed!"));
         Console.WriteLine("對方不在線上,發送失敗!");
         }
         }
         else
         {
         Console.WriteLine("receive from B");
         if (clientSocketA != null && clientSocketA.IsBound)
         {
         Console.WriteLine("a IS BOUND");
         clientSocketA.Send(result, 0, revceiveNumber, SocketFlags.None);
         } 
         else
         {
         myClientSocket.Send(Encoding.ASCII.GetBytes("the people is not online! Send Failed!"));
         Console.WriteLine("對方不在線上,發送失?。?);
         }
        
         }
         
         }
         catch(Exception ex)
         {
         Console.WriteLine(ex.Message);
         myClientSocket.Shutdown(SocketShutdown.Both);
         myClientSocket.Close();
         break;
        
         }
         }
        
         }
         }
        }
        
        

        Client端代碼(因為都差不多 就只貼一個了) 

        namespace SocketClient
        {
         class Program
         {
         private static byte[] result = new byte[1024];
         private static Socket clientSocket;
         private static void ListenServer()
         {
         while (true)
         {
         result = new byte[1024];
         int receiveLength = clientSocket.Receive(result);
         
         Console.WriteLine("{0}", Encoding.ASCII.GetString(result, 0, receiveLength));
         }
         
         }
         static void Main(string[] args)
         {
        
         IPAddress ip = IPAddress.Parse("127.0.0.1");
         clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
         try
         {
         clientSocket.Connect(ip, 8885);
         Console.WriteLine("連接成功!");
        
         }
         catch (Exception e)
         {
         Console.WriteLine("連接失??!");
         return;
         }
         Thread threadRead = new Thread(ListenServer);
         threadRead.Start();
         
        
         while(true)
         {
         try
         {
         Thread.Sleep(1000);
         string sendMessage = Console.ReadLine();
         clientSocket.Send(Encoding.ASCII.GetBytes("Sylvia:"+sendMessage));
         
         }
         catch (Exception ex)
         {
         clientSocket.Shutdown(SocketShutdown.Both);
         clientSocket.Close();
         break;
         }
        
         }
         Console.WriteLine("發送完畢 按回車退出");
         Console.ReadKey();
         }
         }
        }
        
        

        寫的時候要特別注意一下Send信息的時候,注意byte[]的傳輸大小,很容易變成byte[]數組的大小而不是內容的大小。 

        這個大家就自己嘗試吧。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        C#利用服務器實現客戶端之間通信

        C#利用服務器實現客戶端之間通信:先來講述下我自己對于整個Socket通信過程的理解,畢竟初學,說錯見諒,知道錯了會改正~ 首先在服務端新建一個serverSocket,對其進行初始化(一般包含AddressFamily:IP地址類型,SocketType:Socket傳輸數據方式,ProtoType:傳輸協議); 接
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久亚洲精品AB无码播放| 亚洲av无码国产精品色在线看不卡| 亚洲韩国精品无码一区二区三区| 国产vA免费精品高清在线观看| 亚洲GV天堂无码男同在线观看| 国产妇乱子伦视频免费| 亚洲另类自拍丝袜第1页| 国产精品成人免费福利| 亚洲一区二区三区在线观看蜜桃| 成人AV免费网址在线观看| 2020天堂在线亚洲精品专区| 97国免费在线视频| 国产亚洲免费的视频看| 日韩内射激情视频在线播放免费| 91亚洲国产成人精品下载| 亚洲天堂免费在线视频| 亚洲精品无码永久中文字幕| 免费国产污网站在线观看15| 亚洲国产精品乱码在线观看97| 成人免费视频观看无遮挡| 无码的免费不卡毛片视频| 亚洲高清国产AV拍精品青青草原| 曰批视频免费40分钟试看天天| 亚洲色大网站WWW永久网站| 亚洲第一成人影院| 18禁无遮挡无码国产免费网站| 亚洲日韩一区精品射精| 亚洲国产av无码精品| 真实国产乱子伦精品免费| 亚洲av无码专区国产不乱码| 一二三四影视在线看片免费 | 成人在线免费视频| 亚洲国产一区二区a毛片| 国产精品九九久久免费视频 | 999zyz**站免费毛片| 亚洲熟妇av一区| 亚洲国产人成中文幕一级二级| 91精品国产免费网站| 精品国产亚洲AV麻豆| 亚洲成人在线网站| 又粗又硬免费毛片|