C#控制台项目Public修饰符无效及方法调用失败问题求助
问题分析与修复方案
错误原因拆解
CS0106: 修饰符'public'对此项无效
你把BroadcastMessage定义成了Main方法的局部方法,C#中局部方法不允许添加访问修饰符(如public),且仅能在包含它的方法内部访问。CS0117: 'Program'不包含'BroadcastMessage'的定义
由于BroadcastMessage是Main的局部方法,不属于Program类的成员,外部类(如Client)无法通过Program.BroadcastMessage调用它。
修复步骤
步骤1:调整方法的位置与修饰符
将BroadcastConnection和BroadcastMessage从Main方法内部移到Program类级别,作为类的静态方法:
namespace ChatterServer { class Program { static List<Client> users; static TcpListener listener; static void Main(string[] args) { users = new List<Client>(); listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 4242); listener.Start(); while (true) { var client = new Client(listener.AcceptTcpClient()); users.Add(client); BroadcastConnection(); } } // 移至类级别,定义为静态方法 static void BroadcastConnection() { foreach (var user in users) { foreach (var usr in users) { var broadcastPacket = new PacketBuilder(); broadcastPacket.WriteOpCode(1); broadcastPacket.WriteMessage(usr.Username); broadcastPacket.WriteMessage(usr.UID.ToString()); user.ClientSocket.Client.Send(broadcastPacket.GetPacketBytes()); } } } // 移至类级别,添加public修饰符允许外部访问 public static void BroadcastMessage(string message) { foreach(var user in users) { var msgPacket = new PacketBuilder(); msgPacket.WriteOpCode(5); msgPacket.WriteMessage(message); user.ClientSocket.Client.Send(msgPacket.GetPacketBytes()); } } } }
步骤2:修复Client类中的调用与逻辑问题
using ChatterServer; using ChatterServer.Net.IO; using System; using System.Net.Sockets; namespace ChatterServer // 确保Client类在同一命名空间下,才能访问Program类 { class Client { public string Username { get; set; } public Guid UID { get; set; } public TcpClient ClientSocket { get; set; } PacketReader packetReader; public Client(TcpClient client) { ClientSocket = client; UID = Guid.NewGuid(); packetReader = new PacketReader(ClientSocket.GetStream()); var opcode = packetReader.ReadByte(); Username = packetReader.ReadMessage(); Console.WriteLine($"[{DateTime.Now}]: Client has connected with username: {Username}"); // 启动消息处理线程,否则Process方法不会执行 Task.Run(Process); } void Process() { while (true) { try { var opcode = packetReader.ReadByte(); switch (opcode) { case 5: // 修复:读取消息应使用ReadMessage而非ReadByte var msg = packetReader.ReadMessage(); Console.WriteLine($"[{DateTime.Now}]: Message received... {msg}"); Program.BroadcastMessage(msg); break; default: break; } } catch (Exception) { Console.WriteLine($"[{UID.ToString()}]: Disconnected..."); ClientSocket.Close(); // 移除throw避免服务器崩溃,改为退出循环 break; } } } } }
额外注意事项
- Client类必须放在
ChatterServer命名空间下,否则无法访问Program的public静态方法。 - 必须在Client构造函数中启动Process方法的执行(如用Task.Run),否则不会处理客户端消息。
- 异常处理中不要直接throw,避免服务器因单个客户端断开而崩溃。
内容的提问来源于stack exchange,提问作者Connor Allsopp
相关产品推荐
相关产品推荐

