c# 和网络 - 客户端侦听和服务器发送以及最有效的 C# 套接字网络?

c# and networking - Client listening and server send and most efficient C# socket networking?

我正在开发一款依赖标准 System.Net.Sockets 网络库的游戏。我应该使用什么是最有效和最标准化的 "system"?当某个事件发生时,客户端是否应该每隔设定的秒数发送一次数据请求?我的另一个问题是,客户端监听和接收数据是否需要端口转发?这是怎么做到的,是否有另一个专门为只在客户端监听而创建的套接字?如何在客户端的同一个套接字上发送消息和监听?我很难掌握网络的概念,我两天前开始弄乱它。

创建稳定、高质量的服务器需要您具备丰富的网络和对象管理知识。

我强烈建议您在尝试从头开始创建自己的服务器之前先从较小的东西开始,或者至少尝试使用已制作的不同游戏的服务器,尝试对其进行改进或添加新功能.

也就是说,有几种方法可以设置服务器,如果您计划拥有多个客户端,您通常不希望它们随时发送数据,因为这可以使服务器停滞不前,您希望以这样一种方式构建它,即客户端按计划发送尽可能少的数据,而服务器可以在准备就绪时请求更多数据。如何设置和构建取决于您。

服务器通常必须在路由器上转发一个端口,以便请求从 Internet 发送到服务器,这就是原因。当您的计算机连接到网站(例如 Whosebug)时,它会在随机端口上发出请求,路由器会记住您发出的端口并记住发送者(您),当服务器向您发送信息时请求返回路由器知道您想要该数据并将其发送回给您,在 运行 服务器的情况下,没有对客户端的出站请求(例如 Jack),因此路由器不知道 jacks 请求在哪里应该去。通过在路由器中添加端口转发规则,您说传递到端口 25565(例如)的所有信息都应该发送到您的服务器。

客户端一般不需要转发端口,因为它们只是发出出站请求和接收数据。

Server Starts, server starts listening on port 25565

Client starts, client connects to server on port 25565 and initiates a connection

Server responds to client on whatever port the client used to connect (this is done behind the scenes in sockets)

Communication continues from here.

Should the client send data requests every set amount of seconds, when a certain event happens?

没有。尽快发送消息。套接字堆栈具有确定何时实际发送数据的算法。例如Nagle算法。

但是,如果您发送大量消息,将所有消息放入同一个套接字方法调用中可能会有所帮助。但是,您需要为每个客户端发送几千条消息,然后再发送几千条消息才能给您带来任何好处。

My other question, is a port forward required for a client to listen and receive data?

没有。一旦建立了套接字连接,它就是双向的。即两个端点和发送和接收信息,而不会为另一个端点搞砸。

但要实现这一点,您通常必须使用异步操作,以便您可以一直接收。

How is this done, is there another socket created specifically for listening only on the client?

服务器有一个专用套接字(一个侦听器),其唯一目的是接受客户端套接字。当侦听器接受来自远程端点的新连接时,您将获得一个新的套接字对象,它表示与新连接的端点的连接。

How can I send messages and listen on the same socket on the client?

最简单的方法是使用异步接收和阻塞发送。

如果你不想一个人搞定一切,你可以试试我的 Apache licensed library http://sharpmessaging.net.