ホームページ  >  記事  >  バックエンド開発  >  C# ソケットは単純なコンソール ケースを実装します

C# ソケットは単純なコンソール ケースを実装します

巴扎黑
巴扎黑オリジナル
2018-05-25 14:17:382688ブラウズ

この記事では主に C# ソケットの単純なコンソールのケースを共有します。興味のある方は参照してください


1. ソケット インスタンス オブジェクトをインスタンス化して設定します

a. IP アドレスとポートを作成します b. リスニング アドレスをバインドします

2. 接続を監視します

a.メインスレッドがフリーズしないように実行します (スレッドを開始し、パラメーターはオブジェクト型である必要があります)

b. ループを使用して接続を待機し、通信を担当するソケット インスタンスを返します c. 返されたソケットインスタンスは、接続されているカスタマー サービスの IP アドレスを取得します

3. カスタマー サービスによって送信されたメッセージを受信します

a. リスニング メソッドで新しいスレッドの実行を開始します

b. ループを使用して、メッセージを送信して呼び出します。メッセージを取得するメソッドは、バイト変数パラメータをコンテナとして渡す必要があります。メソッドの戻り値は int で、取得した有効なバイト数を示します c. 有効なバイト数が 0 の場合は、ループから抜けます d. カスタマー サービスへの返信メッセージを受信します

4 . コンソール プログラム サーバー 終了コード

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace ServerSocket
{
 class Program
 {
  static void Main(string[] args)
  {
   Console.WriteLine("Hello World!");
   Socket serverSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
   IPAddress ip = IPAddress.Any;
   IPEndPoint point = new IPEndPoint(ip, 2333);
   //socket绑定监听地址
   serverSocket.Bind(point);
   Console.WriteLine("Listen Success");
   //设置同时连接个数
   serverSocket.Listen(10);

   //利用线程后台执行监听,否则程序会假死
   Thread thread = new Thread(Listen);
   thread.IsBackground = true;
   thread.Start(serverSocket);

   Console.Read();
  }

  /// <summary>
  /// 监听连接
  /// </summary>
  /// <param name="o"></param>
  static void Listen(object o)
  {
   var serverSocket = o as Socket;
   while (true)
   {
    //等待连接并且创建一个负责通讯的socket
    var send = serverSocket.Accept();
    //获取链接的IP地址
    var sendIpoint = send.RemoteEndPoint.ToString();
    Console.WriteLine($"{sendIpoint}Connection");
    //开启一个新线程不停接收消息
    Thread thread = new Thread(Recive);
    thread.IsBackground = true;
    thread.Start(send);
   }
  }

  /// <summary>
  /// 接收消息
  /// </summary>
  /// <param name="o"></param>
  static void Recive(object o)
  {
   var send = o as Socket;
   while (true)
   {
    //获取发送过来的消息容器
    byte[] buffer = new byte[1024 * 1024 * 2];
    var effective = send.Receive(buffer);
    //有效字节为0则跳过
    if (effective == 0)
    {
     break;
    }
    var str = Encoding.UTF8.GetString(buffer,0, effective);
    Console.WriteLine(str);
           var buffers = Encoding.UTF8.GetBytes("Server Return Message");
           send.Send(buffers);

   }
  }
 }
}

2. クライアント

1. ソケット インスタンス オブジェクトをインスタンス化して接続します

a.

b. サーバー側でリンクを確立します

2. サーバーによって送信されたメッセージを受信します

a. ループを使用して、送信されたメッセージを取得しますそして、メッセージを取得するメソッドを呼び出して、バイト変数パラメータをコンテナとして渡します。メソッドの戻り値は int で、取得した有効なバイト数を示します

c. 有効なバイト数が 0 の場合、ループから抜けます

3. サーバーにメッセージを送信します

a. send(ソケットオブジェクトの)メソッドを呼び出して直接送信します

4. コンソールプログラムのクライアントコード

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace SocketClient
{
 class Program
 {
  static void Main(string[] args)
  {
   Console.WriteLine("Hello World!");
   //创建实例
   Socket socketClient = new Socket(SocketType.Stream, ProtocolType.Tcp);
   IPAddress ip = IPAddress.Parse("192.168.0.111");
   IPEndPoint point = new IPEndPoint(ip, 2333);
   //进行连接
   socketClient.Connect(point);
   
   //不停的接收服务器端发送的消息
   Thread thread = new Thread(Recive);
   thread.IsBackground = true;
   thread.Start(socketClient);

   //不停的给服务器发送数据
   int i = 0;
   while (true)
   {
    i++;
    var buffter = Encoding.UTF8.GetBytes($"Test Send Message:{i}");
    var temp = socketClient.Send(buffter);
    Thread.Sleep(1000);
   }
   
  }


  /// <summary>
  /// 接收消息
  /// </summary>
  /// <param name="o"></param>
  static void Recive(object o)
  {
   var send = o as Socket;
   while (true)
   {
    //获取发送过来的消息
    byte[] buffer = new byte[1024 * 1024 * 2];
    var effective = send.Receive(buffer);
    if (effective == 0)
    {
     break;
    }
    var str = Encoding.UTF8.GetString(buffer, 0, effective);
    Console.WriteLine(str);
   }
  }
 }
}

以上がC# ソケットは単純なコンソール ケースを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。