サーバー側プログラムを作成し、TcpListener でIPアドレスとポートをバインドしてポート監視を開始し、クライアントからのTCP接続を待ち受けます。実装は2種類用意しています:コンソールアプリケーション、WinFormsウィンドウアプリケーション。
主要APIの解説
IPAddress:ローカルPCのIPアドレスを表します。IPAddress.Parse("127.0.0.1")で文字列形式のIPをオブジェクトへ変換します。127.0.0.1:ローカルループバックアドレス。自PCからのみアクセス可能です。LAN内の他の端末から接続させたい場合は、192.168.x.xのようなLAN側IPを指定してください;IPAddress.Any:PC上の全てのネットワークカードのIPで待ち受けを行います。
TcpListener:TCPサーバー待ち受けクラス。コンストラクタ引数:IPアドレス + ポート番号listener.Start():監視開始。実行後、サーバーはクライアントからの接続を待機します。
コンソール版
using System;
using System.Net;
using System.Net.Sockets;
namespace TalkService
{
class Program
{
static void Main(string[] args)
{
// IPオブジェクトを作成
IPAddress ip = IPAddress.Parse("127.0.0.1");
// ポート9500を監視するTCPリスナーを生成
TcpListener listener = new TcpListener(ip, 9500);
// 待ち受けを開始
listener.Start();
Console.WriteLine("監視を開始します…Eキーで終了");
ConsoleKeyInfo info;
do
{
info = Console.ReadKey();
} while (info.Key != ConsoleKey.E);
listener.Stop(); // 終了時に監視を停止
}
}
}Code language: JavaScript (javascript)
このコードは監視を起動するだけで、AcceptTcpClient によるクライアント接続待ちは実行していません。単にプログラムが終了しないようにしている状態です。
WinForms版
使用するコントロール:(WinFormフォームにコントロールを追加し、IP・ポート設定、送信テキスト入力などを実装できます)
textBoxIP:IP入力欄(初期値127.0.0.1)textBoxPort:ポート入力欄(初期値9500)buttonStart:【開始】ボタンtextBoxInfo:情報表示用テキストボックス
using System;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
namespace SocketChatServer
{
public partial class Form1 : Form
{
IPAddress ip;
TcpListener listener;
public Form1()
{
InitializeComponent();
}
private void buttonStart_Click(object sender, EventArgs e)
{
// IPとポートを解析
ip = IPAddress.Parse(this.textBoxIP.Text);
int port = Convert.ToInt32(this.textBoxPort.Text);
listener = new TcpListener(ip, port);
// 監視起動
listener.Start();
// ログ出力
string log = $"サーバー起動 {DateTime.Now.ToShortTimeString()}\r\n";
this.textBoxInfo.Text = log + this.textBoxInfo.Text;
}
}
}Code language: PHP (php)
残課題
- UIフリーズの問題
listener.AcceptTcpClient()はブロッキングメソッドです。ボタンクリックイベントのUIメインスレッドから直接呼び出すとウィンドウが固まります。別スレッドを起動するかasync/awaitで非同期的に接続待ちを行う必要があります。 - ポートの競合
ポート9500が他プログラムによって使用されている場合、new TcpListener()実行時に例外が発生します。開発時は try‑catch で例外処理を加えてください。 - 他ホストからの接続
127.0.0.1をバインドした場合は自PCからのデバッグのみ可能。LAN内の他機器から接続させるには、自身のLAN側IPを設定し、ファイアウォールでポート9500を許可してください。
サーバー側ポート監視
Previous: 概要
Next: クライアント TcpClient