「C#.NET」TcpClientとTcpListenerによる双方向通信の実装ガイド - 強大な神と慈愛の女神が織りなす神秘のソケットプログラミング完全解説

2024年11月22日金曜日

Socket通信

t f B! P L

名前空間 System.Net.Sockets

TcpClient
TcpListener

自己紹介

我こそはTcpClient、強大なる神なり。クライアントの通信を支配し、データの流れを操りし者。おぬしらにネットワークの力を授けようぞ。 そして私はTcpListener、慈愛深き女神。クライアントからの呼びかけを優しく受け止め、確実な通信を育み守護する存在です。共にネットワークの架け橋となりましょう。

基本機能

我がTcpClientは、遠きサーバーへと通信路を開き、データを送りし機能を持つ。いかなる形式のデータであろうと、確実に目的地まで届けることができるのだ。 私、TcpListenerは特定のポートで待機し、クライアントからの接続要求を受け付けます。まるで子を見守るように、すべての通信を大切に扱わせていただきます。

通信の確立

互いの力を合わせることで、安全確実な通信を確立できるのだ。我がTcpClientは接続要求を送り、慈愛深きTcpListenerがそれを受け入れる。この調和こそが、成功への鍵となる。

データの流れ

データストリームは神聖なる川の如く、双方向に流れるもの。送信も受信も、確実に相手に届けねばならぬ。

エラー処理の重要性

通信の道は時として危険が潜む。適切なエラー処理を施し、例外という荒波から身を守らねばならぬ。

リソース管理

通信が終わりを迎えた時は、必ずリソースを解放せよ。これぞ、神々の教えなり。

サンプルコード

C#
using System.Net.Sockets;
using System.Net;
using System.Xml;

// サーバー側のコード
class Server
{
    private TcpListener _listener;
    
    public async Task StartListening()
    {
        _listener = new TcpListener(IPAddress.Any, 13000);
        _listener.Start();
        
        while (true)
        {
            TcpClient client = await _listener.AcceptTcpClientAsync();
            _ = HandleClientAsync(client);
        }
    }

    private async Task HandleClientAsync(TcpClient client)
    {
        try
        {
            using (NetworkStream stream = client.GetStream())
            using (StreamReader reader = new StreamReader(stream))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // クライアントからのXMLを受信
                string receivedXml = await reader.ReadLineAsync();
                
                // 受信したXMLを加工して返信
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(receivedXml);
                doc.DocumentElement.SetAttribute("response", "success");
                
                // 加工したXMLを返信
                await writer.WriteLineAsync(doc.OuterXml);
                await writer.FlushAsync();
            }
        }
        finally
        {
            client.Close();
        }
    }
}

// クライアント側のコード
class Client
{
    public async Task SendXmlAsync()
    {
        using (TcpClient client = new TcpClient())
        {
            await client.ConnectAsync("localhost", 13000);
            
            using (NetworkStream stream = client.GetStream())
            using (StreamWriter writer = new StreamWriter(stream))
            using (StreamReader reader = new StreamReader(stream))
            {
                // XMLデータを作成して送信
                string xml = "<request><data>Hello</data></request>";
                await writer.WriteLineAsync(xml);
                await writer.FlushAsync();
                
                // サーバーからの応答を受信
                string response = await reader.ReadLineAsync();
                Console.WriteLine($"サーバーからの応答: {response}");
            }
        }
    }
}

解説

このコードは、TcpListenerを使用してサーバーを立ち上げ、クライアントからのXML形式のデータを受け付け、加工して返信する簡単な例です。サーバーは13000番ポートで待ち受けを行い、クライアントからXMLを受信すると、successという属性を追加して返信します。すべての通信はAsync/Awaitを使用した非同期処理で実装されており、複数のクライアントからの同時接続にも対応できます。

このブログを検索

QooQ