![]() |
1
26
因为这是“入门”我的答案将坚持一个简单的实现,而不是一个高度可伸缩的实现。在使事情变得更复杂之前,最好先对简单的方法感到舒服。
1-捆绑和倾听
而不是走DNS的路线,但我认为这两种方式都没有真正的问题。
1.5-接受客户端连接
2-接收数据
我认为选择1500个字节应该没问题,甚至2048个字节也可以。
或者,你可以避免使用
3-发送数据并指定数据长度
或者,如果您的消息格式(其组件的顺序)是以某种方式设计的,以便客户机能够在任何时候确定是否应该有更多的数据跟随(例如,代码0x01表示next将是int和string,代码0x02表示next将是16字节等)。结合
为了安全起见,您可能需要添加对所接收组件的验证,以确保只处理正常值。例如,如果接收到长度为1TB的字符串的指示,则可能在某个地方发生了数据包损坏,关闭连接并强制客户端重新连接并“重新启动”可能更安全。这种方法为您提供了一个非常好的捕获所有行为,以防意外失败。
4/5-关闭客户端和服务器
因为你必须迎合“未知断开”无论如何得到一个稳健的解决方案,使任何更复杂的断开通常是没有意义的。
6-未知断开
唯一可靠的方法是在下次尝试 发送 有点联系。在这一点上,如果连接出现任何问题,您将始终收到一个异常,指示失败。 因此,检测所有意外连接的唯一方法是实现“ping”机制,理想情况下,客户端和服务器将定期向另一端发送消息,这只会导致指示接收到“ping”的响应消息。 为了优化不必要的ping,您可能希望有一个“超时”机制,它只在一段时间内没有从另一端接收到其他流量时发送ping(例如,如果来自服务器的最后一条消息超过x秒,则客户端发送ping以确保连接没有在没有通知的情况下终止)。
更先进的
我建议不要尝试这个,直到你有简单的版本和工作。 另外请注意,如果您不打算扩展到几十个客户,这实际上不会是一个问题,无论。只有当您打算扩展到数千或数十万个连接的客户机时,而不是让您的服务器彻底崩溃,异步技术才是真正必要的。 我可能已经忘记了其他一些重要的建议,但这应该足以让您从一个相当健壮和可靠的实现开始 |
![]() |
2
13
1个- 在套接字上绑定和侦听
在我看来很好。不过,代码将只将套接字绑定到一个IP地址。如果您只想监听任何IP地址/网络接口,请使用
为了保证将来的安全,您可能需要支持IPv6。要监听任何IPv6地址,请使用
请注意,不能同时侦听任何IPv4和任何IPv6地址,除非使用
Dual-Stack Socket
. 这将要求您解除
启用
Teredo
用你的插座,你需要设置
2个- 接收数据
我建议使用
读取固定数量的字节有点尴尬:
在哪里?
3个- 发送数据并指定数据长度 你的方法应该是有效的,尽管你可能不想在重新发明轮子和设计一个新的协议这条路上走下去。看一看 BEEP 或者是一些简单的事情 protobuf . 根据您的目标,可能需要考虑在套接字(如WCF或其他RPC机制)之上选择一个抽象。 4/5/6年- 关闭未知断开连接 什么 jerryjvl 唯一可靠的检测机制是ping或在连接空闲时发送keep alives。 尽管在任何情况下都必须处理未知的断开连接,但我个人会保留一些协议元素,以便在双方同意的情况下关闭连接,而不是在没有警告的情况下关闭它。 |
![]() |
3
2
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 5 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 5 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 5 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |