WinForm(十五)窗體間通訊

在很多WinForm的程式中,會有客戶端之間相互通訊的需求,或服務端與客戶端通訊的需求,這時就要用到TCP/IP的功能。在。NET中,主要是透過Socket來完成的,下面的例子是透過一個TcpListerner作為監聽,等待TcpClient的連線,連線成功後就可以利用NetStream進行資訊互通了。

在互相通訊過程中,傳送和接收分別在不同的執行緒中處理,並且還要處理UI更新。

using System。Collections。Generic;using System。IO;using System。Net;using System。Net。Http;using System。Net。Sockets;namespace WinFormsDemo15{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } ///

/// 建立連線後的網路流 /// NetworkStream _stream; private void ConnectionButton_Click(object sender, EventArgs e) { if (IsServer。Checked) { AcceptTcpClient(); } else { var tcpClient = new TcpClient(IPTextBox。Text, int。Parse(PortTextBox。Text)); _stream = tcpClient。GetStream(); ReciveMessage(_stream); } } /// /// 在一個新執行緒中接收TcpClient連線 /// void AcceptTcpClient() { Task。Run(() => { var listener = new TcpListener(IPAddress。Any, int。Parse(PortTextBox。Text)); listener。Start(); var tcpClient = listener。AcceptTcpClient(); this。Invoke(() => { YouTextBox。Text += $“{DateTime。Now。ToString(”yyyy-MM-dd HH:mm:ss“)} \r\n收到客戶端連線。\r\n”; }); _stream = tcpClient。GetStream(); ReciveMessage(_stream); }); } /// /// 接收訊息 /// /// 網路流 void ReciveMessage(NetworkStream stream) { Task。Run(() => { while (true) { var messageArr = new byte[1024]; stream。Read(messageArr, 0, messageArr。Length); this。Invoke(() => { var message = System。Text。Encoding。UTF8。GetString(messageArr)。Trim(‘\0’); YouTextBox。Text += $“{DateTime。Now。ToString(”yyyy-MM-dd HH:mm:ss“)} 對方說:\r\n{message}\r\n”; }); } }); } /// /// 傳送訊息 /// /// /// private void SendButton_Click(object sender, EventArgs e) { var messageArr = System。Text。Encoding。UTF8。GetBytes(MyTextBox。Text); _stream。Write(messageArr, 0, messageArr。Length); _stream。Flush(); YouTextBox。Text += $“{DateTime。Now。ToString(”yyyy-MM-dd HH:mm:ss“)} 我說:\r\n{MyTextBox。Text}\r\n”; MyTextBox。Clear(); } }}

下面是演示結果:

WinForm(十五)窗體間通訊