「C Sharpとネットワーク - TCP Client」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
30行目: 30行目:


== サンプルコード ==
== サンプルコード ==
  <syntaxhighlight lang="cpp">
以下の例では、TcpClientクラスを使用して、サーバに接続およびメッセージを送信して応答を受信している。<br>
  public void tcpConnectAndSend()
<br>
  <syntaxhighlight lang="c#">
  using System;
using System.Text;
using System.IO;
using System.Net.Sockets;
class TcpClientExample
  {
  {
     var ip = "localhost";
     static void Main()
    var port = 8888;
    {
      string server = "<ホスト名またはIPアドレス>"; // サーバのアドレス
      int port     = <ポート番号>;               // ポート番号
   
   
    client.Connect(ip, port);
      try
      {
          using (TcpClient client = new TcpClient(server, port))
          {
            Console.WriteLine("サーバに接続");
   
   
    try
            using (NetworkStream stream = client.GetStream())
    {
            {
      using (System.Net.Sockets.NetworkStream ns = client.GetStream())
                // サーバにメッセージを送信
      {
                string message = "Hello, Server";
          ns.ReadTimeout  = 1000;
                byte[] data = Encoding.UTF8.GetBytes(message);
          ns.WriteTimeout  = 1000;
                stream.Write(data, 0, data.Length);
          byte[] sendBytes = Encoding.UTF8.GetBytes("message: hoge");
                Console.WriteLine($"送信メッセージ: {message}");
          ns.Write(sendBytes, 0, sendBytes.Length);
                // サーバーからの応答を受信
                data = new byte[256];
                int bytes = stream.Read(data, 0, data.Length);
                string responseData = Encoding.UTF8.GetString(data, 0, bytes);
                Console.WriteLine($"受信メッセージ: {responseData}");
            }
          }
      }
      catch (ArgumentNullException e)
      {  // 無効な引数が渡された場合
          Console.WriteLine($"ArgumentNullException: {e.Message}");
      }
      catch (SocketException e)
      {  // ネットワーク関連のエラーが発生した場合
          Console.WriteLine($"SocketException: {e.Message}");
      }
      catch (IOException e)
      {  // ストリームの読み書き中にエラーが発生した場合
          Console.WriteLine($"IOException: {e.Message}");
      }
      catch (Exception e)
      {  // その他の予期せぬエラーが発生した場合
          Console.WriteLine($"予期せぬエラーが発生しました: {e.Message}");
       }
       }
    }
    }
    catch (IOException e)
    {
        // 送信失敗
    }
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

2024年9月13日 (金) 18:37時点における版

概要

TCP (Transmission Control Protocol) は、インターネットプロトコルスイートの中核をなす通信プロトコルの1つである。
TCPは信頼性の高い通信を提供する強力なプロトコルであり、C#の豊富なネットワーキングAPIと組み合わせることで、効率的なネットワークアプリケーションの開発が可能になる。

C#においても、TCPを利用したネットワークプログラミングは重要な位置を占めている。

TCPの主な特徴は、信頼性の高い通信を提供することである。
これは、データの送受信を確実に行い、パケットの損失や重複、順序の入れ替わりを防ぐ機能を持っているためである。

また、フロー制御や輻輳制御の仕組みも備えており、ネットワークの状況に応じて通信速度を調整する。

C#でTCP通信を実装する場合は、主にSystem.Net.Sockets名前空間を使用する。
この名前空間には、TcpClientクラスやTcpListenerクラス等が含まれており、これらを使用してクライアントとサーバの通信を簡単に実装できる。

TcpClientクラスを使用すると、サーバへの接続やデータの送信が可能になる。
TcpListenerクラスは、サーバ側でクライアントからの接続を待ち受けるために使用する。

実際の通信では、ストリームを介してデータのやり取りを行う。
NetworkStreamクラスを使用して、接続したソケットからデータを読み書きする。
これにより、テキストやバイナリデータを効率的に送受信することができる。

C#でTCP通信を実装する場合は、非同期プログラミングの手法を活用することが推奨される。
BeginConnectメソッドやBeginAcceptメソッド等を使用するこにより、アプリケーションの応答性を向上させることができる。

セキュリティ面では、SSL / TLS証明書を使用して通信を暗号化することが可能である。
C#では、SslStreamクラスを使用してこれを実現することができる。

また、接続の確立、切断、タイムアウトの処理、エラーハンドリング等を適切に実装することにより、安定したネットワークアプリケーションを開発することができる。


サンプルコード

以下の例では、TcpClientクラスを使用して、サーバに接続およびメッセージを送信して応答を受信している。

 using System;
 using System.Text;
 using System.IO;
 using System.Net.Sockets;
 
 class TcpClientExample
 {
    static void Main()
    {
       string server = "<ホスト名またはIPアドレス>";  // サーバのアドレス
       int port      = <ト番号>;                // ポート番号
 
       try
       {
          using (TcpClient client = new TcpClient(server, port))
          {
             Console.WriteLine("サーバに接続");
 
             using (NetworkStream stream = client.GetStream())
             {
                // サーバにメッセージを送信
                string message = "Hello, Server";
                byte[] data = Encoding.UTF8.GetBytes(message);
                stream.Write(data, 0, data.Length);
                Console.WriteLine($"送信メッセージ: {message}");
 
                // サーバーからの応答を受信
                data = new byte[256];
                int bytes = stream.Read(data, 0, data.Length);
                string responseData = Encoding.UTF8.GetString(data, 0, bytes);
                Console.WriteLine($"受信メッセージ: {responseData}");
             }
          }
       }
       catch (ArgumentNullException e)
       {  // 無効な引数が渡された場合
          Console.WriteLine($"ArgumentNullException: {e.Message}");
       }
       catch (SocketException e)
       {  // ネットワーク関連のエラーが発生した場合
          Console.WriteLine($"SocketException: {e.Message}");
       }
       catch (IOException e)
       {  // ストリームの読み書き中にエラーが発生した場合
          Console.WriteLine($"IOException: {e.Message}");
       }
       catch (Exception e)
       {  // その他の予期せぬエラーが発生した場合
          Console.WriteLine($"予期せぬエラーが発生しました: {e.Message}");
       }
    }
 }