在代码中,listener变量在ConnectToServer()方法中被初始化为一个新的TcpListener对象,并且在Disconnect()方法中被释放。然而,在ReceiveImages()方法中又重新定义了一个新的listener变量,导致在Disconnect()方法中释放的listener变量没有赋值给ReceiveImages()方法中的listener变量,所以在ReceiveImages()方法中的listener变量为null。

要解决这个问题,可以将ReceiveImages()方法中的listener变量定义为类级别的变量,而不是在方法内部重新定义。这样就可以在ConnectToServer()方法中初始化listener变量,并在Disconnect()方法中释放listener变量。修改后的代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO;

namespace sop_client
{
    public partial class main : Form
    {
        private TcpClient client;
        private NetworkStream stream;
        private Thread receiveThread;
        private bool continueReceiving;
        private TcpListener listener;
        private bool isDisconnected = false;

        public main()
        {
            InitializeComponent();
        }

        // 按钮点击事件,获取本机IP并发送到服务器
        private void button1_Click(object sender, EventArgs e)
        {
            if (client == null || !client.Connected)
            {
                ConnectToServer();
                button1.Text = "停止连接";
            }
            else
            {
                Disconnect();
                button1.Text = "开始连接";
            }
            string localIP = GetLocalIPAddress();
            textBox1.Text = localIP;
            //SendIPAddress(localIP);
        }

        // 获取本机IP地址
        private string GetLocalIPAddress()
        {
            string localIP = "";
            var host = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
            foreach (var ip in host.AddressList)
            {
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    localIP = ip.ToString();
                    break;
                }
            }
            return localIP;
        }
        
        // 连接到服务器
        private void ConnectToServer()
        {
            try
            {
                string serverIP = textBox3.Text;
                int serverPort = 1024;

                client = new TcpClient();
                client.Connect(serverIP, serverPort);

                stream = client.GetStream();

                // 提取本机 IP 地址
                string localIP = GetLocalIPAddress();

                // 发送本机 IP 地址到服务器
                byte[] ipBytes = Encoding.ASCII.GetBytes(localIP);
                stream.Write(ipBytes, 0, ipBytes.Length);

                // 接收连接成功字符串
                byte[] responseBytes = new byte[client.ReceiveBufferSize];
                int bytesRead = stream.Read(responseBytes, 0, responseBytes.Length);
                string response = Encoding.ASCII.GetString(responseBytes, 0, bytesRead);
                string response1 = "Connected successfully";
                // 在TextBox2中显示连接成功字符串
                if (response == response1)
                {
                    label3.Text = response1;
                    label3.ForeColor = Color.DarkGreen;
                }
                else
                {
                    label3.Text = response;
                    label3.ForeColor = Color.Red;
                }

                // 启动一个线程来接收图片
                receiveThread = new Thread(ReceiveImages);
                receiveThread.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        
        // 断开连接
        private void Disconnect()
        {
            try
            {
                continueReceiving = false;
                stream.Close();
                client.Close();
                client = null; // 释放套接字资源
                isDisconnected = true;
                // 关闭并释放套接字资源
                listener.Stop();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        // 接收图片
        private void ReceiveImages()
        {
            continueReceiving = true;
            listener = new TcpListener(IPAddress.Parse(GetLocalIPAddress()), 1025);
            listener.Start();

            while (continueReceiving)
            {
                try
                {
                    TcpClient imageClient = listener.AcceptTcpClient();
                    NetworkStream imageStream = imageClient.GetStream();

                    // 先接收图像数据的长度
                    byte[] lengthBytes = new byte[4];
                    imageStream.Read(lengthBytes, 0, 4);
                    int length = BitConverter.ToInt32(lengthBytes, 0);

                    byte[] imageData = new byte[length];
                    int totalBytesRead = 0;
                    int bytesRead = 0;

                    while (totalBytesRead < length &&
                           (bytesRead = imageStream.Read(imageData, totalBytesRead, length - totalBytesRead)) > 0)
                    {
                        totalBytesRead += bytesRead;
                    }

                    if (totalBytesRead > 0)
                    {
                        using (MemoryStream ms = new MemoryStream(imageData))
                        {
                            Image receivedImage = Image.FromStream(ms);

                            // 在PictureBox中展示图片
                            pictureBox1.Image = receivedImage;
                        }
                    }
                    // 关闭并释放套接字资源
                    imageStream.Close();
                    imageClient.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
            // 停止监听并释放套接字资源
            if (!isDisconnected)
            {
                // 停止监听并释放套接字资源
                listener.Stop();
            }
        }

        // 窗口关闭时关闭连接和线程
        private void main_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                if (client != null && client.Connected)
                {
                    client.Close();
                }
                if (listener != null)
                {
                    listener.Stop();
                }
                if (receiveThread != null && receiveThread.IsAlive)
                {
                    receiveThread.Abort();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

这样修改后,应该不再提示listener为null的错误

根据上述代码定义了listener改为using System;using SystemCollectionsGeneric;using SystemComponentModel;using SystemData;using SystemDrawing;using SystemLinq;using SystemText;using SystemWindowsForms;using SystemNe

原文地址: https://www.cveoy.top/t/topic/iy4J 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录