轉載自: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端口實現的。從自己創建的線程中修改控件信息,用到了委托。

