首先是監聽
namespace TcpIpTest
{
public partial class ListenerForm : Form
{
private Thread listenThread;
public bool keepReading=false;
public ListenerForm()
{
InitializeComponent();
}
private void actionButton_Click(object sender, EventArgs e)
{
if (!keepReading)
{
string address = IPAddressTextBox.Text;
string port = IPPortTextBox.Text;
string addressRegex = @"^\d+\.\d+\.\d+\.\d+$";
string portRegx = @"^\d+$";
if (Regex.IsMatch(address, addressRegex) && Regex.IsMatch(port, portRegx))
{
keepReading = true;
//監聽的是本地的IP地址,因爲電腦可以同時鏈接到多個網絡,所以一臺電腦可以同時有不同的IP地址,這裏需要指明要監聽哪個IP的哪個端口
listenThread = new Thread(() => ipListen(IPAddress.Parse(address), int.Parse(port)));
listenThread.Start();
this.stateLabel.Text = "正在監聽";
this.actionButton.Text = "停止監聽";
}
else
{
MessageBox.Show("請填寫正確的IP地址和端口");
}
}
else
{
keepReading = false;
this.stateLabel.Text = "空閒";
this.actionButton.Text = "開始監聽";
}
}
private void ipListen(IPAddress address, int port)
{
TcpListener listener = new TcpListener(address, port);
listener.Start();
OneString oneString = new OneString(changeResultTextBox);
while (keepReading)//這是一個閥,來控制是否脫離線程,因爲要把listener停掉,所以不能用abort來關閉線程
{
if (listener.Pending())//這是判斷是否有輸入的,必須要加這個判斷,不然線程就會在下面的AcceptTcpClient卡住
{
using (TcpClient client = listener.AcceptTcpClient())
{
using (StreamReader reader = new StreamReader(client.GetStream(), Encoding.Default))
{
string content = reader.ReadToEnd();
this.Invoke(oneString, content);
}
}
}
}
listener.Stop();
}
private delegate void OneString(string content);
private void changeResultTextBox(string content)
{
this.resultTextBox.Text += content;
}
private void ListenerForm_FormClosing(object sender, FormClosingEventArgs e)
{
keepReading = false;
}
}
}
然後是發送
namespace TcpIpTest
{
public partial class SendForm : Form
{
public SendForm()
{
InitializeComponent();
}
private void sendButton_Click(object sender, EventArgs e)
{
string address = IPAddressTextBox.Text;
string port = IPPortTextBox.Text;
string addressRegex = @"^\d+\.\d+\.\d+\.\d+$";
string portRegx = @"^\d+$";
string content = this.contentTextBox.Text;
if (Regex.IsMatch(address, addressRegex) && Regex.IsMatch(port, portRegx) && !string.IsNullOrWhiteSpace(content))
{
using (TcpClient client = new TcpClient())
{
try
{
//這裏是目標的IP地址和端口
client.Connect(address, int.Parse(port));
using (StreamWriter writer = new StreamWriter(client.GetStream(), Encoding.Default))
{
writer.Write(content);
}
}
catch (Exception e1)
{
if (e1 is SocketException)
{
MessageBox.Show("無法ping通");
}
}
}
}
else
{
MessageBox.Show("請填寫正確的IP地址、端口和內容");
}
}
}
}