上一期使用TCP协议接收图片数据,本期我们使用TCP协议来实现文本的接收和发送。

关于TCP协议的具体内容本文不做赘述,如果有感兴趣的伙伴可以去CSDN或者B站查看相关视频。

简单的布置一下界面, 将数据接收和数据发送分开来。接收数据的部分监听我们的端口,发送数据的部分根据我们输出的端口地址来向目标地点发送数据。

并且由于逻辑的问题,使用这些内容的时候会把其他内容禁用,防止端口被占用或者重复监听。

接收数据

 private void StartListeningText()
        {
            try
            {
                // 获取选定的IP地址和端口
                IPAddress ipAddress = IPAess.Parse(IPAdssChoose.Selem.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)
            {
                Mex.Show($"错误:{ex.Message}", "错误", Messttons.OK, .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);
                }
            }
        }

发送数据的代码中,我们需要将我们的文本内容转换成字节数组,之后根据文本框中的目标地址,将数据发送出去。

嘉立创PCB

还没有评论,抢个沙发!