客戶端完整程式碼
class Client
{
static void Main()
{
Console.WriteLine("Client Running ...");
TcpClient client;
ConsoleKey key;
const int BufferSize = 8192;
try { client = new TcpClient(); client.Connect("localhost", 8500); }
catch (Exception ex) { Console.WriteLine(ex.Message); return; }
Console.WriteLine("Server Connected! {0} --> {1}",
client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
NetworkStream stream = client.GetStream();
Console.WriteLine("Menu: S - Send, X - Exit");
do
{
key = Console.ReadKey(true).Key;
if (key == ConsoleKey.S)
{
Console.Write("Input the message: ");
string msg = Console.ReadLine();
byte[] buffer = Encoding.Unicode.GetBytes(msg);
lock (stream) { stream.Write(buffer, 0, buffer.Length); }
Console.WriteLine("Sent: {0}", msg);
buffer = new byte[BufferSize];
int bytesRead;
lock (stream) { bytesRead = stream.Read(buffer, 0, BufferSize); }
msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received: {0}", msg);
}
} while (key != ConsoleKey.X);
stream.Dispose(); client.Close();
// 按 Q 退出...
}
}
關鍵細節
lock(stream):NetworkStream 非執行緒安全,單執行緒此處非必要,但習慣加上為多執行緒擴展鋪路。
Encoding.Unicode:雙端統一編碼,支援中文。
- 固定
BufferSize=8192:簡化範例,實務應依協定解析訊息邊界 (長度前綴、分隔符等)。
- 選單迴圈:S 發送、X 結束。