麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > C# > 正文

C#利用服務(wù)器實(shí)現(xiàn)客戶(hù)端之間通信

2024-09-07 17:05:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

先來(lái)講述下我自己對(duì)于整個(gè)Socket通信過(guò)程的理解,畢竟初學(xué),說(shuō)錯(cuò)見(jiàn)諒,知道錯(cuò)了會(huì)改正~ 

首先在服務(wù)端新建一個(gè)serverSocket,對(duì)其進(jìn)行初始化(一般包含AddressFamily:IP地址類(lèi)型,SocketType:Socket傳輸數(shù)據(jù)方式,ProtoType:傳輸協(xié)議); 

接著我們要設(shè)置server端要綁定的IP:port;然后開(kāi)始監(jiān)聽(tīng),并設(shè)置最多同時(shí)監(jiān)聽(tīng)多少個(gè)Client.

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

獲得連接之后,server就可以和這個(gè)Client進(jìn)行通信了,當(dāng)加入第二個(gè)Client(我們稱(chēng)其為ClientB)時(shí),Server接收到ClientB的消息,可以將這個(gè)消息轉(zhuǎn)發(fā)給前一個(gè)Client(我們稱(chēng)其為ClientA),當(dāng)受到ClientA的消息,也可以轉(zhuǎn)發(fā)給ClientB。這樣就實(shí)現(xiàn)了Clients之間的通信了。(重點(diǎn)在保存連接信息!!)

那么現(xiàn)在貼上代碼講解:

Server端代碼 

namespace SocketServer{  class Program  {    private static byte[] result = new byte[1024];       static Socket serverSocket;    private static string client;    private static Socket clientSocket;    //我這里存了兩個(gè)Client,因?yàn)樽约弘娔X開(kāi)了兩個(gè)Client,不會(huì)有多的    //理論上應(yīng)該開(kāi)一個(gè)Socket[]來(lái)保存信息,最好用一個(gè)二元組將client的信息和連接綁定起來(lái)    //這樣就可以實(shí)現(xiàn)斷開(kāi)連接后下次登陸還是可以識(shí)別是這個(gè)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);      //進(jìn)入監(jiān)聽(tīng)狀態(tài)      Console.WriteLine("監(jiān)聽(tīng){0}成功", serverSocket.LocalEndPoint.ToString());      //開(kāi)啟一個(gè)線(xiàn)程來(lái)監(jiān)聽(tīng)客戶(hù)端連接      Thread myThread = new Thread(ListenClientConnect);      myThread.Start();      Console.ReadLine();    }    /// <summary>    /// 監(jiān)聽(tīng)客戶(hù)端連接    /// </summary>    private static void ListenClientConnect()    {      while (true)      {        //Client連接上后 得到這個(gè)連接        clientSocket = serverSocket.Accept();        //這里我因?yàn)橹挥袃蓚€(gè)Client,所以就簡(jiǎn)單寫(xiě)了        if (clientSocketA == null)        {          clientSocketA = clientSocket;        }        else if (clientSocketB == null)        {          clientSocketB = clientSocket;        }        else        {          //當(dāng)其中一個(gè)斷開(kāi)了,又重新連接時(shí),需要再次保存連接          if (clientSocketB.IsBound)          {            clientSocketA = clientSocketB;            clientSocketB = clientSocket;          }          else          {            clientSocketB = clientSocketA;            clientSocketA = clientSocket;          }                  }        clientSocket.Send(Encoding.ASCII.GetBytes("say hello"));        //開(kāi)個(gè)線(xiàn)程接收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("接受客戶(hù)端{(lán)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("對(duì)方不在線(xiàn)上,發(fā)送失敗!");            }          }          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("對(duì)方不在線(xiàn)上,發(fā)送失敗!");            }          }                  }        catch(Exception ex)        {          Console.WriteLine(ex.Message);          myClientSocket.Shutdown(SocketShutdown.Both);          myClientSocket.Close();          break;        }      }    }  }}            
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 毛片在线播放视频 | 国产精品二区高清在线 | 羞羞视频免费网站 | 性aaa| 法国性经典xxxhd | 色七七网站 | 美女污污在线观看 | 成人三区四区 | 精品一区二区久久久久久按摩 | 成人三级电影网址 | 毛片午夜 | 亚洲尻逼视频 | 日韩在线播放第一页 | 久久成人免费网站 | 超碰99在线观看 | 久久精品探花 | 美国一级黄色毛片 | 草莓视频在线导航 | 精品国产一区二区三区在线观看 | av在线免费观看网 | 午夜神马福利视频 | 中文字幕精品在线视频 | 国产精品久久久久久久午夜片 | 久久精精品 | 欧美国产综合视频 | 毛片免费观看完整版 | 看免费黄色大片 | 国产日韩三区 | 99亚洲视频 | 最新亚洲国产 | 日韩黄在线观看 | 草草视频免费 | 性生活视频软件 | 久久久久久久久久亚洲 | 国产成人高清在线 | 亚洲国产中文字幕 | 精品久久久久久久久久久久久 | 日本一区二区视频在线观看 | 超级av在线 | 午夜精品小视频 | 成人在线视频一区 |