• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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
    主站蜘蛛池模板: 国内精品久久国产大陆| 久久精品免费大片国产大片| 精品人妻少妇一区二区三区在线 | 久久精品无码专区免费东京热| 亚洲国产精品无码久久久久久曰 | 亚洲AV成人精品一区二区三区| 久久香蕉超碰97国产精品| 精品不卡一区二区| 国产精品一区二区久久| 麻豆精品不卡国产免费看| 国产精品自在线拍国产电影| 欧美日韩专区麻豆精品在线 | 国产精品人成在线播放新网站| 国产精品夜色一区二区三区| 一本一本久久a久久综合精品蜜桃| 青青草原精品国产亚洲av| 久久久久99精品成人片三人毛片| 91精品国产高清久久久久久91| 精品人妻V?出轨中文字幕| 亚洲永久永久永久永久永久精品| 久久久久人妻一区精品果冻| 777久久精品一区二区三区无码| 国产精品1区2区| 国产精品熟女高潮视频| 久久久免费精品re6| 亚洲精品国产精品乱码不99 | 经典国产乱子伦精品视频| 四虎国产精品永久在线观看| 亚洲精品无码Av人在线观看国产| 日韩AV毛片精品久久久| 精品熟女少妇av免费久久| 香蕉国产精品麻豆亚洲欧美日韩精品自拍欧美v国 | 亚洲国产精品成人午夜在线观看 | 91人妻人人澡人人爽人人精品| 国产精品专区第二| 久草视频在线这里精品| 国产精品一二区| 2021最新国产精品一区| 99热成人精品免费久久| 亚洲欧美精品AAAAAA片| 香港三级精品三级在线专区|