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

ナビゲーションに移動 検索に移動
29行目: 29行目:
<br><br>
<br><br>


== クライアント : 送信 ==
 
== クライアント ==
==== 送信 ====
以下の例では、TcpClientクラスを使用して、非同期でサーバに接続およびメッセージを送信している。<br>
以下の例では、TcpClientクラスを使用して、非同期でサーバに接続およびメッセージを送信している。<br>
また、タイムアウトが発生した場合の再試行処理や高度なエラー処理等も追加することを推奨する。<br>
また、タイムアウトが発生した場合の再試行処理や高度なエラー処理等も追加することを推奨する。<br>
87行目: 89行目:
       }
       }
       catch (SocketException e)
       catch (SocketException e)
      {  // ネットワーク関連のエラーが発生した場合
          Console.WriteLine($"SocketException: {e.Message}");
      }
      catch (TimeoutException e)
      {  // タイムアウトが発生した場合
          Console.WriteLine($"TimeoutException: {e.Message}");
      }
      catch (Exception e)
      {  // その他の予期せぬエラーが発生した場合
          Console.WriteLine($"予期せぬエラーが発生: {e.Message}");
      }
    }
}
</syntaxhighlight>
<br>
==== 受信 ====
以下の例では、TcpClientクラスを使用して、非同期でサーバに接続およびメッセージを受信している。<br>
また、タイムアウトが発生した場合の再試行処理や高度なエラー処理等も追加することを推奨する。<br>
<br>
<syntaxhighlight lang="c#">
using System;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Net.Sockets;
class AsyncTcpClientReceiver
{
    static async Task Main(string[] args)
    {
      string server          = "<ホスト名またはIPアドレス>";  // サーバーのアドレス
      int port                = <ポート番号>;                // ポート番号
      int timeoutMilliseconds = 5000;                      // タイムアウト(ミリ秒)
      try
       {
       {
          using (TcpClient client = new TcpClient())
          {
            // サーバへ接続
            var connectTask = client.ConnectAsync(server, port);
            // サーバへの接続が確立するまで待機
            if (await Task.WhenAny(connectTask, Task.Delay(timeoutMilliseconds)) != connectTask)
            {  // タイムアウトが発生した場合
                throw new TimeoutException("エラー: サーバへの接続がタイムアウト");
            }
            using (NetworkStream stream = client.GetStream())
            {  // サーバへメッセージを送信
                byte[] data = new byte[256];
                var readTask = stream.ReadAsync(data, 0, data.Length);
                if (await Task.WhenAny(readTask, Task.Delay(timeoutMilliseconds)) != readTask)
                {
                  throw new TimeoutException("エラー: メッセージの受信がタイムアウト");
                }
                int bytes = await readTask;
                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}");
           Console.WriteLine($"SocketException: {e.Message}");
      }
      catch (IOException e)
      {  // ストリームの読み書き中にエラーが発生した場合
          Console.WriteLine($"IOException: {e.Message}");
       }
       }
       catch (TimeoutException e)
       catch (TimeoutException e)
       {
       { // タイムアウトが発生した場合
           Console.WriteLine($"TimeoutException: {e.Message}");
           Console.WriteLine($"TimeoutException: {e.Message}");
       }
       }
       catch (Exception e)
       catch (Exception e)
       {
       { // その他の予期せぬエラーが発生した場合
           Console.WriteLine($"予期せぬエラーが発生: {e.Message}");
           Console.WriteLine($"予期せぬエラーが発生: {e.Message}");
       }
       }

案内メニュー