欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年08月04日 16:01:38   作者:Sylvia小伊  
這篇文章主要為大家詳細(xì)介紹了C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信,感興趣的小伙伴們可以參考一下

先來(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(我們稱其為ClientB)時(shí),Server接收到ClientB的消息,可以將這個(gè)消息轉(zhuǎn)發(fā)給前一個(gè)Client(我們稱其為ClientA),當(dāng)受到ClientA的消息,也可以轉(zhuǎn)發(fā)給ClientB。這樣就實(shí)現(xiàn)了Clients之間的通信了。(重點(diǎn)在保存連接信息?。。?br />

那么現(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è)線程來(lái)監(jiān)聽(tīng)客戶端連接
      Thread myThread = new Thread(ListenClientConnect);
      myThread.Start();
      Console.ReadLine();

    }
    /// <summary>
    /// 監(jiān)聽(tīng)客戶端連接
    /// </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è)線程接收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("接受客戶端{(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ì)方不在線上,發(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ì)方不在線上,發(fā)送失??!");
            }

          }
          
        }
        catch(Exception ex)
        {
          Console.WriteLine(ex.Message);
          myClientSocket.Shutdown(SocketShutdown.Both);
          myClientSocket.Close();
          break;

        }
      }

    }
  }
}

Client端代碼(因?yàn)槎疾畈欢?就只貼一個(gè)了) 

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("發(fā)送完畢 按回車(chē)退出");
      Console.ReadKey();
    }
  }
}

寫(xiě)的時(shí)候要特別注意一下Send信息的時(shí)候,注意byte[]的傳輸大小,很容易變成byte[]數(shù)組的大小而不是內(nèi)容的大小。 

這個(gè)大家就自己嘗試吧。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • .net 頁(yè)面指定區(qū)域打印的方法

    .net 頁(yè)面指定區(qū)域打印的方法

    .net 頁(yè)面指定區(qū)域打印的方法,需要的朋友可以參考一下
    2013-04-04
  • 關(guān)于.Net?6?添加NLog的方法

    關(guān)于.Net?6?添加NLog的方法

    .Net項(xiàng)目中關(guān)于日志的組件還是很多的,包括log4net,Nlog,以及.net?core?框架自帶的Logging,今天就簡(jiǎn)單介紹一下Nlog,對(duì).Net?6?添加NLog相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-01-01
  • Asp.Net Core添加請(qǐng)求頭自定義認(rèn)證的示例

    Asp.Net Core添加請(qǐng)求頭自定義認(rèn)證的示例

    這篇文章主要介紹了Asp.Net Core添加請(qǐng)求頭自定義認(rèn)證的示例,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下
    2021-04-04
  • asp.net core webapi項(xiàng)目配置全局路由的方法示例

    asp.net core webapi項(xiàng)目配置全局路由的方法示例

    這篇文章主要介紹了asp.net core webapi項(xiàng)目配置全局路由的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • ASP.NET?Core使用自定義日志中間件

    ASP.NET?Core使用自定義日志中間件

    這篇文章介紹了ASP.NET?Core使用自定義日志中間件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • asp.NET開(kāi)發(fā)中正則表達(dá)式中BUG分析

    asp.NET開(kāi)發(fā)中正則表達(dá)式中BUG分析

    又發(fā)現(xiàn)了一個(gè) .net的bug!最近在使用正則表達(dá)式的時(shí)候發(fā)現(xiàn):在忽略大小寫(xiě)的時(shí)候,匹配值從 0xff 到 0xffff 之間的所有字符,正則表達(dá)式竟然也能匹配兩個(gè) ASCII 字符:i(code: 0x69) 和 I(code: 0x49);但是仍然不能匹配其他的 ASCII 字母和數(shù)字。
    2008-10-10
  • aspx不顯示ViewState的實(shí)例

    aspx不顯示ViewState的實(shí)例

    重寫(xiě)Render方法,來(lái)去掉ViewState,提高網(wǎng)站的性能
    2013-03-03
  • ASP.NET?Core項(xiàng)目使用xUnit進(jìn)行單元測(cè)試

    ASP.NET?Core項(xiàng)目使用xUnit進(jìn)行單元測(cè)試

    這篇文章介紹了ASP.NET?Core項(xiàng)目使用xUnit進(jìn)行單元測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • .Net 對(duì)于PDF生成以及各種轉(zhuǎn)換的操作

    .Net 對(duì)于PDF生成以及各種轉(zhuǎn)換的操作

    這篇文章主要介紹了.Net 對(duì)于PDF生成以及各種轉(zhuǎn)換的操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • asp.net GridView控件鼠標(biāo)移動(dòng)某行改變背景顏色(方法一)

    asp.net GridView控件鼠標(biāo)移動(dòng)某行改變背景顏色(方法一)

    asp.net GridView控件鼠標(biāo)移動(dòng)某行改變背景顏色
    2009-12-12

最新評(píng)論