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

C#使用Socket實現(xiàn)服務(wù)器與多個客戶端通信(簡單的聊天系統(tǒng))

 更新時間:2020年02月12日 14:43:09   作者:風之_訴  
這篇文章主要介紹了C#使用Socket實現(xiàn)服務(wù)器與多個客戶端通信(簡單的聊天系統(tǒng)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

擴展:
由于server端是存儲了所有server與client的連接對象,因此我們是可以基于此demo的基礎(chǔ)上實現(xiàn)聊天系統(tǒng):

* 每當一個與用戶發(fā)言時,是由server接收到的某個用戶的發(fā)言信息的,此時服務(wù)器端可以通過循環(huán)發(fā)送該用戶發(fā)送的信息給每個已經(jīng)連接連接的用戶(排除發(fā)送者)。

Server端代碼:

class Program
{
  //創(chuàng)建一個和客戶端通信的套接字
  static Socket SocketWatch = null;
  //定義一個集合,存儲客戶端信息
  static Dictionary<string, Socket> ClientConnectionItems = new Dictionary<string, Socket> { };
 
  static void Main(string[] args)
  {
    //端口號(用來監(jiān)聽的)
    int port = 6000;
 
    //string host = "127.0.0.1";
    //IPAddress ip = IPAddress.Parse(host);
    IPAddress ip = IPAddress.Any;
 
    //將IP地址和端口號綁定到網(wǎng)絡(luò)節(jié)點point上 
    IPEndPoint ipe = new IPEndPoint(ip, port);
 
    //定義一個套接字用于監(jiān)聽客戶端發(fā)來的消息,包含三個參數(shù)(IP4尋址協(xié)議,流式連接,Tcp協(xié)議) 
    SocketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //監(jiān)聽綁定的網(wǎng)絡(luò)節(jié)點 
    SocketWatch.Bind(ipe);
    //將套接字的監(jiān)聽隊列長度限制為20 
    SocketWatch.Listen(20);
 
 
    //負責監(jiān)聽客戶端的線程:創(chuàng)建一個監(jiān)聽線程 
    Thread threadwatch = new Thread(WatchConnecting);
    //將窗體線程設(shè)置為與后臺同步,隨著主線程結(jié)束而結(jié)束 
    threadwatch.IsBackground = true;
    //啟動線程   
    threadwatch.Start();
 
    Console.WriteLine("開啟監(jiān)聽......");
    Console.WriteLine("點擊輸入任意數(shù)據(jù)回車退出程序......");
    Console.ReadKey();
 
    SocketWatch.Close();
 
    //Socket serverSocket = null;
 
    //int i=1;
    //while (true)
    //{
    //  //receive message
    //  serverSocket = SocketWatch.Accept();
    //  Console.WriteLine("連接已經(jīng)建立!");
    //  string recStr = "";
    //  byte[] recByte = new byte[4096];
    //  int bytes = serverSocket.Receive(recByte, recByte.Length, 0);
    //  //recStr += Encoding.ASCII.GetString(recByte, 0, bytes);
    //  recStr += Encoding.GetEncoding("utf-8").GetString(recByte, 0, bytes);
 
    //  //send message
    //  Console.WriteLine(recStr);
 
    //  Console.Write("請輸入內(nèi)容:");
    //  string sendStr = Console.ReadLine();
 
    //  //byte[] sendByte = Encoding.ASCII.GetBytes(sendStr);
    //  byte[] sendByte = Encoding.GetEncoding("utf-8").GetBytes(sendStr);
 
    //  //Thread.Sleep(4000);
 
    //  serverSocket.Send(sendByte, sendByte.Length, 0);
    //  serverSocket.Close();
    //  if (i >= 100)
    //  {
    //    break;
    //  }
    //  i++;
    //}
      
    //sSocket.Close();
    //Console.WriteLine("連接關(guān)閉!");
 
 
    //Console.ReadLine();
  }
 
  //監(jiān)聽客戶端發(fā)來的請求 
  static void WatchConnecting()
  {
    Socket connection = null;
 
    //持續(xù)不斷監(jiān)聽客戶端發(fā)來的請求   
    while (true)
    {
      try
      {
        connection = SocketWatch.Accept();
      }
      catch (Exception ex)
      {
        //提示套接字監(jiān)聽異常   
        Console.WriteLine(ex.Message);
        break;
      }
 
      //客戶端網(wǎng)絡(luò)結(jié)點號 
      string remoteEndPoint = connection.RemoteEndPoint.ToString();
      //添加客戶端信息 
      ClientConnectionItems.Add(remoteEndPoint, connection);
      //顯示與客戶端連接情況
      Console.WriteLine("\r\n[客戶端\"" + remoteEndPoint + "\"建立連接成功! 客戶端數(shù)量:" + ClientConnectionItems .Count+ "]");
 
      //獲取客戶端的IP和端口號 
      IPAddress clientIP = (connection.RemoteEndPoint as IPEndPoint).Address;
      int clientPort = (connection.RemoteEndPoint as IPEndPoint).Port;
 
      //讓客戶顯示"連接成功的"的信息 
      string sendmsg = "[" + "本地IP:" + clientIP + " 本地端口:" + clientPort.ToString() + " 連接服務(wù)端成功!]";
      byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendmsg);
      connection.Send(arrSendMsg);
 
      //創(chuàng)建一個通信線程   
      Thread thread = new Thread(recv);
      //設(shè)置為后臺線程,隨著主線程退出而退出 
      thread.IsBackground = true;
      //啟動線程   
      thread.Start(connection);
    }
  }
 
  /// <summary>
  /// 接收客戶端發(fā)來的信息,客戶端套接字對象
  /// </summary>
  /// <param name="socketclientpara"></param>  
  static void recv(object socketclientpara)
  {
    Socket socketServer = socketclientpara as Socket;
 
    while (true)
    {
      //創(chuàng)建一個內(nèi)存緩沖區(qū),其大小為1024*1024字節(jié) 即1M   
      byte[] arrServerRecMsg = new byte[1024 * 1024];
      //將接收到的信息存入到內(nèi)存緩沖區(qū),并返回其字節(jié)數(shù)組的長度  
      try
      {
        int length = socketServer.Receive(arrServerRecMsg);
 
        //將機器接受到的字節(jié)數(shù)組轉(zhuǎn)換為人可以讀懂的字符串   
        string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length);
 
        //將發(fā)送的字符串信息附加到文本框txtMsg上   
        Console.WriteLine("\r\n[客戶端:" + socketServer.RemoteEndPoint + " 時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")+ "]\r\n" + strSRecMsg);
 
        //Thread.Sleep(3000);
        //socketServer.Send(Encoding.UTF8.GetBytes("[" + socketServer.RemoteEndPoint + "]:"+strSRecMsg));
        //發(fā)送客戶端數(shù)據(jù)
        if (ClientConnectionItems.Count > 0)
        {
          foreach (var socketTemp in ClientConnectionItems)
          {
            socketTemp.Value.Send(Encoding.UTF8.GetBytes("[" + socketServer.RemoteEndPoint + "]:" + strSRecMsg));
          }
        }
      }
      catch (Exception)
      {
        ClientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString());
        //提示套接字監(jiān)聽異常 
        Console.WriteLine("\r\n[客戶端\"" + socketServer.RemoteEndPoint + "\"已經(jīng)中斷連接! 客戶端數(shù)量:" + ClientConnectionItems.Count+"]");
        //關(guān)閉之前accept出來的和客戶端進行通信的套接字 
        socketServer.Close();
        break;
      }
    }
  }
}

Client端代碼:

class Program
{
  //創(chuàng)建1個客戶端套接字和1個負責監(jiān)聽服務(wù)端請求的線程 
  static Thread ThreadClient = null;
  static Socket SocketClient = null;
 
  static void Main(string[] args)
  {
    try
    {
      int port = 6000;
      string host = "127.0.0.1";//服務(wù)器端ip地址
 
      IPAddress ip = IPAddress.Parse(host);
      IPEndPoint ipe = new IPEndPoint(ip, port);
 
      //定義一個套接字監(jiān)聽 
      SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
      try
      {
        //客戶端套接字連接到網(wǎng)絡(luò)節(jié)點上,用的是Connect 
        SocketClient.Connect(ipe);
      }
      catch (Exception)
      {
        Console.WriteLine("連接失?。r\n");
        Console.ReadLine();
        return;
      }
 
      ThreadClient = new Thread(Recv);
      ThreadClient.IsBackground = true;
      ThreadClient.Start();
 
      Thread.Sleep(1000);
      Console.WriteLine("請輸入內(nèi)容<按Enter鍵發(fā)送>:\r\n");
      while(true)
      {
        string sendStr = Console.ReadLine();
        ClientSendMsg(sendStr);
      }
 
      //int i = 1;
      //while (true)
      //{
      //  Console.Write("請輸入內(nèi)容:");
      //  string sendStr = Console.ReadLine();
 
      //  Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      //  clientSocket.Connect(ipe);
      //  //send message
      //  //byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
      //  byte[] sendBytes = Encoding.GetEncoding("utf-8").GetBytes(sendStr);
 
      //  //Thread.Sleep(4000);
 
      //  clientSocket.Send(sendBytes);
 
      //  //receive message
      //  string recStr = ""; 
      //  byte[] recBytes = new byte[4096];
      //  int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0);
      //  //recStr += Encoding.ASCII.GetString(recBytes, 0, bytes);
      //  recStr += Encoding.GetEncoding("utf-8").GetString(recBytes, 0, bytes);
      //  Console.WriteLine(recStr);
 
      //  clientSocket.Close();
      //  if (i >= 100)
      //  {
      //    break;
      //  }
      //  i++;
      //}
        
      //Console.ReadLine();
      //return;
 
      //string result = String.Empty;
 
    }
    catch (Exception ex) 
    {
      Console.WriteLine(ex.Message);
      Console.ReadLine();
    }
  }
 
  //接收服務(wù)端發(fā)來信息的方法  
  public static void Recv()
  {
      int x = 0;
    //持續(xù)監(jiān)聽服務(wù)端發(fā)來的消息 
    while (true)
    {
      try
      {
        //定義一個1M的內(nèi)存緩沖區(qū),用于臨時性存儲接收到的消息 
        byte[] arrRecvmsg = new byte[1024 * 1024];
 
        //將客戶端套接字接收到的數(shù)據(jù)存入內(nèi)存緩沖區(qū),并獲取長度 
        int length = SocketClient.Receive(arrRecvmsg);
 
        //將套接字獲取到的字符數(shù)組轉(zhuǎn)換為人可以看懂的字符串 
        string strRevMsg = Encoding.UTF8.GetString(arrRecvmsg, 0, length);
        if (x == 1)
        {
          Console.WriteLine("\r\n服務(wù)器:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n" + strRevMsg+"\r\n");
            
        }
        else
        {
          Console.WriteLine(strRevMsg + "\r\n");
          x = 1;
        }
      }
      catch (Exception ex)
      {
        Console.WriteLine("遠程服務(wù)器已經(jīng)中斷連接!" + ex.Message + "\r\n");
        break;
      }
    }
  }
 
  //發(fā)送字符信息到服務(wù)端的方法 
  public static void ClientSendMsg(string sendMsg)
  {
    //將輸入的內(nèi)容字符串轉(zhuǎn)換為機器可以識別的字節(jié)數(shù)組   
    byte[] arrClientSendMsg = Encoding.UTF8.GetBytes(sendMsg);
    //調(diào)用客戶端套接字發(fā)送字節(jié)數(shù)組   
    SocketClient.Send(arrClientSendMsg);
  }  
}

測試結(jié)果:

server端:

client端:

代碼下載地址:C-Socket_jb51.zip

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中的串口通信SerialPort詳解

    C#中的串口通信SerialPort詳解

    今天這篇文章帶大家學習下C#中的串口通訊。在日常的開發(fā)工作中,如果工作內(nèi)容是CS方向的同學應(yīng)該很容易接觸到串口通訊方面的業(yè)務(wù)需求。那么也就很容易想到C#中SerialPort類,它就是專門來處理串口通訊相關(guān)的
    2022-01-01
  • C#把寫好的類編譯成dll文件的操作方法

    C#把寫好的類編譯成dll文件的操作方法

    在C#中,DLL文件是一種可重用的代碼庫,它包含了已編譯的函數(shù)、類、數(shù)據(jù)和資源,DLL文件可以被多個應(yīng)用程序共享和重用,這樣可以提高代碼的復(fù)用性和可維護性,所以本文給大家介紹了C#如何把寫好的類編譯成dll文件,需要的朋友可以參考下
    2024-09-09
  • C#多線程與異步的區(qū)別詳解

    C#多線程與異步的區(qū)別詳解

    多線程和異步操作兩者都可以達到避免調(diào)用線程阻塞的目的,從而提高軟件的可響應(yīng)性。甚至有些時候我們就認為多線程和異步操作是等同的概念。但是,多線程和異步操作還是有一些區(qū)別的。而這些區(qū)別造成了使用多線程和異步操作的時機的區(qū)別
    2017-06-06
  • C#使用TCP協(xié)議實現(xiàn)數(shù)據(jù)發(fā)送和接受的方法

    C#使用TCP協(xié)議實現(xiàn)數(shù)據(jù)發(fā)送和接受的方法

    這篇文章主要介紹了c#使用TCP協(xié)議實現(xiàn)數(shù)據(jù)發(fā)送和接受,使用TCP協(xié)議實現(xiàn)數(shù)據(jù)的發(fā)送和接受包括客戶端和服務(wù)端兩個部分,本文通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • 基于Json序列化和反序列化通用的封裝完整代碼

    基于Json序列化和反序列化通用的封裝完整代碼

    JSON 是存儲和交換文本信息的語法。類似 XML。JSON 比 XML 更小、更快,更易解析。下面通過實例代碼給大家分享Json序列化和反序列化通用的封裝,需要的的朋友參考下吧
    2017-07-07
  • C#使用表達式樹(LambdaExpression)動態(tài)更新類的屬性值(示例代碼)

    C#使用表達式樹(LambdaExpression)動態(tài)更新類的屬性值(示例代碼)

    這篇文章主要介紹了C#使用表達式樹(LambdaExpression)動態(tài)更新類的屬性值,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • C#使用RenderControl將GridView控件導(dǎo)出到EXCEL的方法

    C#使用RenderControl將GridView控件導(dǎo)出到EXCEL的方法

    這篇文章主要介紹了C#使用RenderControl將GridView控件導(dǎo)出到EXCEL的方法,是C#應(yīng)用程序設(shè)計中非常實用的一個功能,需要的朋友可以參考下
    2014-08-08
  • 在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn)

    在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn)

    這篇文章主要介紹了在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • C#中實現(xiàn)契約測試的方法

    C#中實現(xiàn)契約測試的方法

    這篇文章主要介紹了C#中實現(xiàn)契約測試,在本文中,我將揭開契約測試的神秘面紗,并向您展示如何在 C# 項目中實現(xiàn)它,需要的朋友可以參考下
    2023-09-09
  • C# OpenCvSharp實現(xiàn)通過特征點匹配圖片

    C# OpenCvSharp實現(xiàn)通過特征點匹配圖片

    這篇文章主要為大家詳細介紹了C#如何結(jié)合OpenCVSharp4實現(xiàn)通過特征點匹配圖片,文中的示例代碼簡潔易懂,具有一定的學習價值,需要的小伙伴可以參考下
    2023-11-11

最新評論