上一期使用TCP协议接收图片数据,本期我们使用TCP协议来实现文本的接收和发送。
关于TCP协议的具体内容本文不做赘述,如果有感兴趣的伙伴可以去CSDN或者B站查看相关视频。
本期以及往期的源码都会分享到QQ交流群:656210280……感兴趣的小伙伴可以加群探讨一下。
简单的布置一下界面, 将数据接收和数据发送分开来。接收数据的部分监听我们的端口,发送数据的部分根据我们输出的端口地址来向目标地点发送数据。
并且由于逻辑的问题,使用这些内容的时候会把其他内容禁用,防止端口被占用或者重复监听。
** 接收数据 **
private void StartListeningText() { try { // 获取选定的IP地址和端口 IPAddress ipAddress = IPAddress.Parse(IPAddressChoose.SelectedItem.ToString()); int port = int.Parse(PortChoose.Text);
// 启动TCP监听 tcpListener = new TcpListener(ipAddress, port); tcpListener.Start(); cancellationTokenSource = new CancellationTokenSource(); isListening = true; listenerThread = new Thread(() => ListenForText(cancellationTokenSource.Token)); listenerThread.Start(); } catch (Exception ex) { MessageBox.Show($"错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void StopListening() { // 停止TCP监听 isListening = false; if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); cancellationTokenSource = null; }
if (tcpListener != null) { tcpListener.Stop(); } }
private void ListenForText(CancellationToken cancellationToken) { try { while (!cancellationToken.IsCancellationRequested) { using (TcpClient tcpClient = tcpListener.AcceptTcpClient()) { using (NetworkStream networkStream = tcpClient.GetStream()) { using (MemoryStream memoryStream = new MemoryStream()) { byte[] buffer = new byte[4096]; int bytesRead;
while ((bytesRead = networkStream.Read(buffer, 0, buffer.Length)) > 0) { memoryStream.Write(buffer, 0, bytesRead); }
// 处理和显示接收到的数据 string receivedText = Encoding.UTF8.GetString(memoryStream.ToArray()); ReciveText.AppendText(receivedText);
} }
// 关闭TcpClient tcpClient.Close(); } } } catch (Exception ex) {
Console.WriteLine($"错误:{ex.Message}"); } }
接收数据的逻辑和上一期接收图像差不多,但是更为简单,我们不需要把数据转为图像,只需要直接把内容显示出来。
发送数据
private void TransButton_Click(object sender, EventArgs e) { int port = int.Parse(PortChooseTran.Text); IPAddress TransAddress = IPAddress.Parse(AddressText.Text.ToString()); if (TransAddress == null) { MessageBox.Show("错误:无可用地址"); return; } //使用TCP发送数据 string TranText = TransFormText.Text; using (TcpClient tcpClient = new TcpClient()) { tcpClient.Connect(TransAddress, port);
using (NetworkStream networkStream = tcpClient.GetStream()) { // 将字符串转换为字节数组 byte[] data = Encoding.UTF8.GetBytes(TranText); // 发送数据 networkStream.Write(data, 0, data.Length); } } }
发送数据的代码中,我们需要将我们的文本内容转换成字节数组,之后根据文本框中的目标地址,将数据发送出去。