在很多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();}/// <summary>/// 創建連接后的網絡流/// </summary>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);}}/// <summary>/// 在一個新線程中接收TcpClient連接/// </summary>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);});}/// <summary>/// 接收消息/// </summary>/// <param name="stream">網絡流</param>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";});}});}/// <summary>/// 發送消息/// </summary>/// <param name="sender"></param>/// <param name="e"></param>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();}}
}
下面是演示結果: