轉載自:http://www.cnblogs.com/WTFly/p/5340617.html
運行這個程序前需要先關閉Windows防火牆,Win7系統關閉防火牆的方法是在控制面板的“控制面板\系統和安全\Windows 防火牆\自定義設置”路徑中,將“家庭或工作(專用)網絡位置設置”和“公用網絡位置設置”下面的選項都選到“關閉Windows防火牆(不推薦)”。
1.界面設計
最下方為發送數據的輸入框,單擊“發送數據”把數據發送到指定IP地址的指定端口號。(本例中,IP地址和端口號都被寫死到代碼中)
2.程序代碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; namespace TcpClientTest { public partial class FormMain : Form { public FormMain() { InitializeComponent(); } private void FormMain_Load(object sender, EventArgs e) { //初始化控件 txtSendMssg.Text = "測試數據"; //打開Listener開始監聽 Thread thrListener = new Thread(new ThreadStart(Listen)); thrListener.Start(); } private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { //強制關閉程序(強行終止Listener) Environment.Exit(0); } //發送數據 private void btnSend_Click(object sender, EventArgs e) { TcpClient tcpClient = new TcpClient(); //tcpClient.Connect(IPAddress.Parse("170.0.0.78"), 2014); tcpClient.Connect(IPAddress.Parse("127.0.0.1"), 2014); NetworkStream ntwStream = tcpClient.GetStream(); if (ntwStream.CanWrite) { Byte[] bytSend = Encoding.UTF8.GetBytes(txtSendMssg.Text); ntwStream.Write(bytSend, 0, bytSend.Length); } else { MessageBox.Show("無法寫入數據流"); ntwStream.Close(); tcpClient.Close(); return; } ntwStream.Close(); tcpClient.Close(); } //監聽數據 private void Listen() { Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(new IPEndPoint(IPAddress.Any, 2014)); //不斷監聽端口 while (true) { listener.Listen(0); Socket socket = listener.Accept(); NetworkStream ntwStream = new NetworkStream(socket); StreamReader strmReader = new StreamReader(ntwStream); Invoke(new PrintRecvMssgDelegate(PrintRecvMssg), new object[] { strmReader.ReadToEnd() }); socket.Close(); } //程序的listener一直不關閉 //listener.Close(); } //線程內向文本框txtRecvMssg中添加字符串及委托 private delegate void PrintRecvMssgDelegate(string s); private void PrintRecvMssg(string info) { txtRecvMssg.Text += string.Format("[{0}]:{1}\r\n", DateTime.Now.ToLongTimeString(), info); } } }
3.運行效果
在發送數據的文本框中分別輸入“千山鳥飛絕”、“萬徑人蹤滅”、“孤舟蓑笠翁”、“獨釣寒江雪”四句話,輸完一句話,單擊一次“發送”按鈕,就可以在接收數據里看到這四句話了。上面代碼中,信息的發送時通過TcpClient連接到127.0.0.1的2014端口,信息的接收是通過Listen函數不斷監聽本機的2014端口實現的。從自己創建的線程中修改控件信息,用到了委托。