You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#控制台项目Public修饰符无效及方法调用失败问题求助

问题分析与修复方案

错误原因拆解

  1. CS0106: 修饰符'public'对此项无效
    你把BroadcastMessage定义成了Main方法的局部方法,C#中局部方法不允许添加访问修饰符(如public),且仅能在包含它的方法内部访问。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:15:17