<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
        主站蜘蛛池模板: 久久精品无码免费不卡| 亚洲精品日韩一区二区小说| xxxx日本在线播放免费不卡| 国产高清免费在线| 美女露隐私全部免费直播| 国产在线观看免费不卡 | 午夜一级毛片免费视频| 亚洲女人18毛片水真多| 久久笫一福利免费导航| 国产成人亚洲精品| 国产精品黄页在线播放免费| 特级毛片A级毛片免费播放| 亚洲精品综合久久| 久久精品免费观看| 亚洲国产成人手机在线电影bd| 成人在线免费看片| 亚洲成a人无码亚洲成av无码 | 亚洲最大AV网站在线观看| 丁香花在线观看免费观看图片 | 免费大片在线观看网站| 男性gay黄免费网站| 亚洲综合另类小说色区| 亚洲欧洲免费视频| 国产亚洲精品VA片在线播放| 国产一区在线观看免费| 国产无遮挡无码视频免费软件 | 免费精品视频在线| 亚洲国产精品国自产拍AV| 四虎成年永久免费网站| 亚洲日韩国产欧美一区二区三区 | 亚洲精品午夜国产va久久| 国产人成免费视频| 国产成人无码区免费网站| 亚洲午夜国产精品无卡| 亚洲国产综合久久天堂| 最近中文字幕免费2019| 免费人成再在线观看网站| 亚洲一卡2卡三卡4卡有限公司| 97无码免费人妻超级碰碰夜夜| 国产黄在线观看免费观看不卡| 亚洲欧洲日韩在线电影|