サーバー側ポート監視

サーバー側プログラムを作成し、TcpListener でIPアドレスとポートをバインドしてポート監視を開始し、クライアントからのTCP接続を待ち受けます。実装は2種類用意しています:コンソールアプリケーションWinFormsウィンドウアプリケーション

主要APIの解説

  1. 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で待ち受けを行います。
  2. TcpListener:TCPサーバー待ち受けクラス。コンストラクタ引数:IPアドレス + ポート番号
  3. 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)

残課題

  1. UIフリーズの問題
    listener.AcceptTcpClient()ブロッキングメソッドです。ボタンクリックイベントのUIメインスレッドから直接呼び出すとウィンドウが固まります。別スレッドを起動するか async/await で非同期的に接続待ちを行う必要があります。
  2. ポートの競合
    ポート9500が他プログラムによって使用されている場合、new TcpListener() 実行時に例外が発生します。開発時は try‑catch で例外処理を加えてください。
  3. 他ホストからの接続
    127.0.0.1 をバインドした場合は自PCからのデバッグのみ可能。LAN内の他機器から接続させるには、自身のLAN側IPを設定し、ファイアウォールでポート9500を許可してください。

サーバー側ポート監視

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です