根据上述代码定义了listener改为using System;using SystemCollectionsGeneric;using SystemComponentModel;using SystemData;using SystemDrawing;using SystemLinq;using SystemText;using SystemWindowsForms;using SystemNe
在代码中,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的错误
原文地址: https://www.cveoy.top/t/topic/iy4J 著作权归作者所有。请勿转载和采集!