使用C#

时间:2019-06-18 21:36:18

标签: c# .net sockets udp client

我有一个与 Udp 一起使用的套接字程序。

我要管理连接到服务器的客户端。

例如,如果客户端已连接到服务器,则将该客户端添加到列表中。 我已经在 Tcp 中使用以下代码完成了此操作:

static readonly Dictionary <int, TcpClient> list_clients = new Dictionary <int, TcpClient>();

例如,仅列表中的客户,他的消息就会被写入。

我将每个客户与GetStream()进行了比较。但是在Udp中,我不知道该怎么做。我可以管理客户吗?

编辑

我使用以下代码从客户端接收消息:

private static UdpClient udpServer = new UdpClient(11000);
private static IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 11000);

static void Main(string[] args)
{
    var firstData = udpServer.Receive(ref remoteEP);
    Console.WriteLine(Encoding.ASCII.GetString(firtsData);
}

预先感谢

1 个答案:

答案 0 :(得分:0)

此代码对我来说效果很好!
服务器:

    public partial class Server : Form
    {
        public Server()
        {
            InitializeComponent();
        }

        void Print(string message)
        {
            listBox1.Items.Add(message);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socket.Bind(new IPEndPoint(IPAddress.Loopback, 55555));
            byte[] vs = new byte[100];
            EndPoint senderRemote = new IPEndPoint(IPAddress.Any, 0);

            Dictionary<EndPoint, int> pairs = new Dictionary<EndPoint, int>();
            int id = 0;
            for (int ii = 0; ii < 5; ii++)
            {
                socket.ReceiveFrom(vs, ref senderRemote);
                if (pairs.ContainsKey(senderRemote))
                    Print(pairs[senderRemote].ToString() + " says:");
                else
                {
                    pairs.Add(senderRemote, id++);
                    Print("new sender");
                }
                Print(senderRemote.ToString());
                Print(Encoding.Unicode.GetString(vs));
                socket.SendTo(vs, senderRemote);
            }

        }
    }

客户端:

    public partial class Client : Form
    {
        public Client()
        {
            InitializeComponent();
        }
        Socket socket;
        private void button1_Click(object sender, EventArgs e)
        {
            socket.Send(Encoding.Unicode.GetBytes("Gholamam!"));
            byte[] vs = new byte[100];
            socket.Receive(vs);
            listBox1.Items.Add(Encoding.Unicode.GetString(vs));
        }

        private void Client_Load(object sender, EventArgs e)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socket.Bind(new IPEndPoint(IPAddress.Loopback, new Random().Next(1024,65000)));
            socket.Connect(IPAddress.Loopback, 55555);
        }
    }

不要忘记客户端和服务器正在通信。因此,他们必须使用折衷的方式进行沟通。如果您想存储客户信息,则该信息必须恒定。为此,您必须bind将其固定为固定的localEndPoint
您还可以在问题注释中使用解决方案:您可以在邮件中添加ID。您也可以同时使用。
P.S .:我使用Socket类而不是TCPClientUDPClient,因为我发现它们有些笨拙且不一致。