如何使用.NET中的TCP类实现两台主机间的通信
1、首先创建TCPSender客户端(TCPDemon)。这里选择WinForm程序。


2、添加IP地址和端口号输入框,以及发送按钮。在发送按钮处编辑事件代码如下:
private void btnSend_Click(object sender, EventArgs e)
{
TcpClient tcpClient = new TcpClient(txtHost.Text, Int32.Parse(txtPort.Text));
NetworkStream ns = tcpClient.GetStream();
FileStream fs = File.Open("greeting.txt", FileMode.Open);
int data = fs.ReadByte();
while(data!=-1)
{
ns.WriteByte((byte)data);
data = fs.ReadByte();
}
fs.Close();
ns.Close();
tcpClient.Close();
}
在上述代码中,从文本款中读入IP地址和端口号,初始化TcpClient类。创建网络数据流类型NetworkStream,并从一个文本中读入内容,然后写入TcpClient的数据流中。


3、创建TCPReceiver客户端。该客户端在启动的后开始监听特定IP地址上的端特定端口号(这里是“192.168.1.10:2112”)。添加关键代码如下:
public Form1()
{
InitializeComponent();
Thread thread = new Thread(new ThreadStart(Listen));
thread.Start();
}
public void Listen()
{
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
int port = 2112;
TcpListener tcpListener = new TcpListener(localAddr, port);
tcpListener.Start();
while (true)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();//接受挂起的tcp请求
NetworkStream ns = tcpClient.GetStream();
StreamReader sr = new StreamReader(ns);
string result = sr.ReadToEnd();
//显示读取的字符串
Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });
}
}
public void UpdateDisplay(string text)
{
txtDisplay.Text = text;
}
protected delegate void UpdateDisplayDelegate(string text);
在上述代码中,TcpListener这个类对端口号进行监听。同时创建NetworkStream读取TcpClient中的数据。为了持续监听,使用了线程工具。同时,为了不堵塞界面主线程,使用了委托以及Invoke()机制。


4、测试程序。先启动接收客户端和发送客户端测试通信过程。



5、处理错误情况。TcpClient发送失败时(“由于目标计算机积极拒绝,无法连接”)。因此在发送的时候要确保目的主机相应端口号处于监听状态,否则发送失败。
