カテゴリ: C# 更新日: 2026/08/28

C#でWebSocket通信入門!ClientWebSocketを使ったリアルタイム通信の基本を解説

C#でWebSocket通信を行う方法(ClientWebSocket)
C#でWebSocket通信を行う方法(ClientWebSocket)

先生と生徒の会話形式で理解しよう

生徒

「C#を使って、サーバーとリアルタイムでデータをやり取りするWebSocket通信ってどうやるんですか?」

先生

「C#ではClientWebSocketという機能を使うと、簡単にWebSocket通信を実装できますよ。」

生徒

「WebSocketって何ですか?普通の通信とどう違うんですか?」

先生

「わかりやすく解説しながら、プログラムの書き方を見ていきましょう!」

1. WebSocketとClientWebSocketとは

1. WebSocketとClientWebSocketとは
1. WebSocketとClientWebSocketとは

まずは言葉の意味から整理しましょう。WebSocket(ウェブソケット)とは、パソコンやスマートフォンなどの端末と、インターネット上のサーバーの間で、一度つながるとずっと接続しっぱなしの状態でデータのやり取りができる仕組みのことです。普通のインターネット通信は、信号機のように「送ったら待つ」という形式が基本ですが、WebSocketは電話回線のように「常に双方向で話せる」状態を作ります。これにより、株価の速報やリアルタイム対戦ゲームのような、一瞬の遅延も許されない通信が可能になります。

そしてClientWebSocket(クライアントウェブソケット)は、C#というプログラミング言語を使って、このWebSocketによる通信を開始したり、データを送受信したりするための便利な「部品」のことです。この部品をプログラムの中で呼び出すだけで、初心者の方でも複雑な通信手順を気にせず、簡単にサーバーと会話を始めることができます。

2. 通信の準備をする

2. 通信の準備をする
2. 通信の準備をする

プログラムを書き始める前に、必要な道具を揃える必要があります。C#でネットワーク通信を行うには、特定の機能(ライブラリと呼びます)をプログラムの中に取り込む必要があります。これを「名前空間の参照」といいます。今回使うClientWebSocketは、System.Net.WebSocketsという場所に保管されています。

まずは、プログラムの冒頭で「これを使いますよ」と宣言しましょう。これがないと、コンピューターは「ClientWebSocketなんて知らないよ」とエラーを出してしまいます。プログラムにおいて「指示を出す」ということは、コンピューターに対して「今からこの機能を使って通信するから準備してね」と伝えることと同じなのです。プログラミングは、こうした事前の準備がとても大切です。


using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;

3. サーバーへ接続するコード

3. サーバーへ接続するコード
3. サーバーへ接続するコード

準備ができたら、実際にサーバーと接続してみましょう。接続先は「URI」(ユーアールアイ)と呼ばれる住所のようなもので指定します。例えば、ws://から始まる文字列がそれにあたります。接続する際は、非同期処理(ひどうきしょり)という技術を使います。これは、通信が終わるまでプログラム全体を止めずに、他の作業もできるようにする賢い仕組みです。接続にはConnectAsyncという命令を使います。

初心者の方は「非同期」という言葉に難しさを感じるかもしれませんが、「郵便物をポストに入れたら、届くのを待ちつつ他の家事をする」と考えてください。届くまでその場で立ち尽くすのは無駄ですよね。プログラムも同じで、通信完了を待ちつつも、アプリの画面をフリーズさせないために重要な手法なのです。


var client = new ClientWebSocket();
var uri = new Uri("wss://echo.websocket.org");
await client.ConnectAsync(uri, CancellationToken.None);
Console.WriteLine("接続完了しました。");

4. データを送信する方法

4. データを送信する方法
4. データを送信する方法

無事に接続できたら、次はデータを送ってみましょう。送信にはSendAsyncという機能を使います。WebSocketで送れるのは、文字だけでなく「バイト配列」という形式です。コンピューターにとって、文字はすべて数字の羅列として扱われます。私たちが入力した文字を、コンピューターが理解できる数字のリストに変換して送る必要があるのです。これを「エンコード」と呼びます。

データを送る際は、一度に全部送るのか、これが最後のデータなのかを指定するフラグも付けます。ここでは「これが一つのデータのまとまりですよ」という合図と共に、文字を送信しています。まるで手紙に封をして、宛先を書いてポストに入れるような作業を、プログラムが代行してくれると考えてください。


string message = "こんにちは、WebSocket!";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(message);
await client.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);

5. サーバーからの返信を受け取る

5. サーバーからの返信を受け取る
5. サーバーからの返信を受け取る

送ったデータに対して、サーバーが返事をくれることがあります。これを受け取るには、受信用の「バッファ」を用意します。バッファとは、一時的にデータを溜めておくための「箱」のようなものです。サーバーから送られてきたデータがこの箱に入り、それを後からプログラムが中身を取り出して、私たちが読める文字に変換します。

受信の命令であるReceiveAsyncを使うと、データが到着するまで待機して、届いたら中身を詳しく調べてくれます。どんな形式のデータが届いたか、すべて受け取れたかを確認できるので安心です。インターネットという広い世界で、特定の相手から確実に言葉を受け取るための重要なプロセスです。


byte[] receiveBuffer = new byte[1024];
var result = await client.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
string receivedMessage = System.Text.Encoding.UTF8.GetString(receiveBuffer, 0, result.Count);
Console.WriteLine("受信したメッセージ: " + receivedMessage);

6. 接続を終了する

6. 接続を終了する
6. 接続を終了する

最後は、サーバーとの通信をきれいに終わらせる方法です。通信をやりっぱなしにして放置するのは、電話をかけたまま受話器を置き忘れるようなものです。相手にも迷惑がかかりますし、コンピューターのメモリも無駄に使ってしまいます。プログラムでは、CloseAsyncという命令を使って、丁寧にお別れの挨拶をします。

これを行うことで、サーバー側も「このクライアントは帰ったんだな」と理解し、他の人の接続を受け入れられるようになります。接続状態を確認しながら、最後にしっかりと切断処理を書くことは、プログラミングにおいてマナーを守るということと同じです。これで一連の流れは完了です。最初は難しく感じるかもしれませんが、一つずつ命令を確認すれば、必ず動かせるようになります。


await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "終了します", CancellationToken.None);
client.Dispose();
Console.WriteLine("通信を切断しました。");
カテゴリの一覧へ
新着記事
New1
C#
C#とは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
New2
C#
C#のメソッドを引数に渡す方法!高階関数の基本を学ぼう
New3
Azure
Azure Front Door Analytics活用|リアルタイム監視とレポートで通信を分析
New4
COBOL
COBOLで数値比較とALPHABETIC・NUMERIC条件をやさしく解説!初心者でも安心ガイド
人気記事
No.1
Java&Spring記事人気No1
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド
No.2
Java&Spring記事人気No2
COBOL
COBOL教育における教材とリソース完全ガイド!初心者でもわかるプログラミング学習の選び方
No.3
Java&Spring記事人気No3
Azure
Azure SQL Database購入モデル比較!vCoreとDTUの違いと選び方を初心者向けに解説
No.4
Java&Spring記事人気No4
C#
C#のLINQでWhere句を使いこなす!初心者でもわかるデータ抽出とフィルタリング
No.5
Java&Spring記事人気No5
COBOL
COBOLのCOPY句の使い方を完全ガイド!初心者でもわかる共通部品の再利用方法
No.6
Java&Spring記事人気No6
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.7
Java&Spring記事人気No7
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.8
Java&Spring記事人気No8
C#
C#のforeachループを完全ガイド!初心者でもわかるコレクション操作の基本