如何使用.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发送失败时(“由于目标计算机积极拒绝,无法连接”)。因此在发送的时候要确保目的主机相应端口号处于监听状态,否则发送失败。