在《C#高級編程》第7版第24章,有提到使用TCP類。
書中寫了一個實例,兩個winform,其中一個點擊按鈕發(fā)送字符串,另一個winform進(jìn)行接收。這個實例有個缺點,只能接收一次。
我將這個實例進(jìn)行了改造。第一版做好后,可以進(jìn)行接收和發(fā)送,但是出現(xiàn)一個問題,就是在關(guān)閉程序后,在電腦的任務(wù)管理器中看到還有進(jìn)程在跑。
進(jìn)行了一些嘗試后改了第二版,終于解決了這個問題。
看一眼這個程序:
在兩臺電腦上分別運(yùn)行此程序,注意要設(shè)置對方的IP地址。
我直接貼上第二版的代碼,然后在標(biāo)明修改的哪兒。
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Net.Sockets;
public partial class Form1 : Form
protected delegate void UpdateDisplayDelegate(string text);
public Thread thread = null;
public TcpClient tcpClientReceiver = null;
TcpListener tcpListener = null;
public Boolean boolStop = false;
thread = new Thread(new ThreadStart(Listen));
string LocalIp = GetSelfIp();
IPAddress localAddr = IPAddress.Parse(LocalIp);
tcpListener = new TcpListener(localAddr, port);
tcpClientReceiver = new TcpClient();
if (!tcpListener.Pending())
tcpClientReceiver = tcpListener.AcceptTcpClient();
NetworkStream ns = tcpClientReceiver.GetStream();
StreamReader sr = new StreamReader(ns);
string result = sr.ReadToEnd();
Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });
public void UpdateDisplay(string text)
string currentContents = textBox4.Text;
currentContents += text+"\r\n";
textBox4.Text = currentContents;
private void button1_Click(object sender, EventArgs e)
public void SendMessage()
TcpClient tcpClient = new TcpClient(textBox1.Text, Int32.Parse(textBox2.Text));
NetworkStream ns = tcpClient.GetStream();
string message = textBox3.Text;
byte[] contentBytes = Encoding.GetEncoding("utf-8").GetBytes(message);
for (int i = 0; i < contentBytes.Length; i++)
ns.WriteByte(contentBytes[i]);
public string GetSelfIp()
System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
if (addressList.Length == 1)
return addressList[0].ToString();
MessageBox.Show("當(dāng)前只支持設(shè)置一個IP的電腦,您的電腦設(shè)有多個IP地址");
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
相對于第一版,主要是添加了變量boolStop,用于控制線程中while循環(huán)結(jié)束的時機(jī)。第二點就是在while循環(huán)中增加了一個判斷,if (!tcpListener.Pending()),這樣在對方?jīng)]有發(fā)送消息時,是不會執(zhí)行到tcpListener.AcceptTcpClient();的。這樣就不會造成線程的阻塞了。這樣直接關(guān)閉了winform,線程thread也會相應(yīng)的結(jié)束。
否則就會造成如下的情況,關(guān)閉了程序,但是任務(wù)管理器中,仍然能夠看到進(jìn)程。
該文章在 2021/2/23 11:18:36 編輯過