建置伺服器端程式,透過 TcpListener 綁定 IP 與通訊埠,啟動通訊埠監聽,等候用戶端建立 TCP 連線。提供兩種實作版本:主控台程式、WinForms 視窗程式。
核心 API 說明
IPAddress:代表本機 IP 位址,IPAddress.Parse("127.0.0.1")可將 IP 字串轉換成物件。127.0.0.1:本機回環位址,僅限本機存取;若要讓區域網路其他電腦連線,請改用區網 IP(例如192.168.x.x);IPAddress.Any:監聽本機所有網路卡的 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");
// 建立TCP監聽器,監聽9500通訊埠
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()屬於封鎖式方法,如果直接在按鈕點擊的主執行緒呼叫,視窗就會凍結。後續需要開新執行緒或是透過async/await非同步等待用戶端連入。 - 通訊埠被佔用
當 9500 通訊埠被其他程式佔用時,執行new TcpListener()會拋出例外,開發階段務必加上 try‑catch 做例外攔截。 - 跨主機連線
綁定127.0.0.1只能本機測試;要讓區網其他電腦連進來,IP 要填寫本機區網位址,同時防火牆要放行 9500 通訊埠。
伺服器端通訊埠監聽
Previous: 簡介
Next: 用戶端TcpClient