C#UDP服务器 - Keep-Alive数据包

时间:2014-01-19 12:29:10

标签: .net sockets networking ip

我目前正在使用UDP协议在客户端/服务器架构的C#中创建一个小应用程序。这是一个代码,最终将用于将在Windows窗体应用程序中制作的2D游戏。

现在,由于UDP是无连接的,所以当用户连接时,我就这样做了,他用专门的消息将他的名字发送到服务器,当服务器收到加入消息时,他将客户端添加到字符串列表中。 / p>

现在,问题是,我不知道如何断开客户端。

当然,如果客户端点击Disconnect按钮,我可以这样做,它会向服务器发送一条消息,断开他的连接。

但是,如果他只是点击“X”退出应用程序,或者他的电量耗尽了怎么办?

我想过制作Keep-Alive数据包,但我想不出有效的方法。

这是服务器代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDP_Server
{
    class Program
    {
        Socket _serverSocket;
        List<string> clients;
        static void Main(string[] args)
        {
            Program go = new Program();
            go.Server();
        }
        void Server()
        {
            byte[] msg = new byte[1024];
            _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12345));
            while (true)
            {
                IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                EndPoint Remote = (EndPoint)(sender);
                int recv = _serverSocket.ReceiveFrom(msg, ref Remote);
                string data = Encoding.ASCII.GetString(msg);
                if (data.Contains("Name!"))
                {
                    clients.Add(data.Split('!')[1]);
                }
                else Console.WriteLine("Message received from {0}:", Remote.ToString());
                Console.WriteLine(Encoding.ASCII.GetString(msg));
                //_serverSocket.SendTo(msg, Remote);
            }
        }
    }
}

不需要客户端代码,因为它唯一要做的就是使用SendTo方法将数据报发送到服务器,以及获取数据的接收方法。

那么我怎样才能建立一个保持活力的架构呢?另外,如果我不仅仅是为了这个人,我应该使用多线程吗?

1 个答案:

答案 0 :(得分:0)

我无法回答您的具体问题,但是WCF可以选择吗?

我不确定你的应用程序具体是什么,但是WCF在连接“ful”和连接“less”场景中消除了很多麻烦。

WCF客户端可以连接和断开连接,并且服务器能够处理多个用户,即使有或没有“多线程”,正如您所说。希望这会有所帮助。