基本上我是java中服务器和客户端编程的新手,我谷歌所有必要的资源来学习这个特定的主题,但是我不明白它们之间的区别。
到目前为止,我对这两者的理解是,他们都可以处理客户请求,但我需要进一步了解每个类的好处,以及何时可以有效使用它的具体情况或特定情况。
例如,我有一个服务器客户端程序,它是团队查看器的一个子集,客户端程序必须在每毫秒内向服务器发送屏幕截图,而服务器将从另一个连接的客户端发布它。代码正在运行,但我发现ServerSocket消耗了大量的Heap,尽管它也成功地提供给服务器和客户端。我还阅读了一个与我的问题相关的博客(链接丢失),表明DatagramSocket是解决方案,因为它不执行Handshakes。
我真的很关心这些课程的好处和缺点。
答案 0 :(得分:10)
ServerSocket
用于接受某些流协议上的传入网络连接;例如TCP / IP。
DatagramSocket
用于在某些无连接数据报/消息协议上发送和接收数据报;例如UDP / IP
补充问题:
基本上什么是数据报
数据报是在单个逻辑数据包中发送的一堆信息。例如,UDP数据包。
这是否意味着数据报=轻量级数据包?
这取决于你对轻量级的定义!
UDP数据报作为IP数据包发送。如果UDP数据报对于IP数据包来说太大,则发送方会将其分解为多个IP数据包,并由接收方重新组装。
什么是无连接[mean],
这意味着两方之间不存在逻辑连接。如果UDP数据报的组件IP包丢失,则UDP数据报丢失。接收者永远不知道(在应用程序级别)。 UDP中没有报告数据丢失和重试。这是典型的"无连接"行为。
是否意味着数据在传输过程中可能会丢失?
基本上,是的。如果您希望在数据报或您应该使用ServerSocket和Socket的事件中传输可靠/无损数据;例如TCP / IP流。
但是,请注意,即使使用(裸)TCP / IP流,也无法保证数据传输:
如果网络出现故障,或者发送方或接收方出现故障,则在数据传输过程中可能会断开连接。这将导致数据丢失......对于该连接。 (套接字不支持重新连接。)如果发送方和/或接收方仍处于活动状态,通常会通知它们连接已断开,但他们不知道原因,或者在传输过程中丢失了多少数据。 / p>
数据在传输过程中可能会以TCP / IP的错误检测无法发现的方式被破坏。接收者不知道发生了这种情况。
这两个问题都可以在应用程序协议级别解决;例如使用消息队列进行第一次强加密和强校验和第二次。
关于您尝试使用ServerSocket
。
代码正在运行,但我发现
ServerSocket
消耗了大量的Heap,尽管它也成功地提供给服务器和客户端。
你做错了什么。如果适当地使用API,则内存开销应该是无关紧要的。
我的猜测是您正在执行以下一项或多项操作:
我还读了一篇与我的问题相关的博客(链接丢失),表明DatagramSocket是解决方案,因为它不会执行Handshakes。
答案 1 :(得分:0)
你说你已经看过google了,但google上有几个页面可以直接解决你的问题。有几个与您的问题具有相同的标题。您甚至表示通过在问题上使用[tcp]和[udp]标记了解它们之间的一些区别。
区别在于使用TCP通信协议,而使用UDP通信协议。也许您的问题不是关于Java,而是关于互联网,计算机网络和通信协议如何工作?
这意味着你必须决定哪个是重要的,速度或可靠性。
数据是否在传输过程中不得损坏?如果是,则必须使用TCP或serversocket。
如果数据必须通过最快的方法到达,即使有丢失的风险,那么您必须使用UDP或datagramsocket。
如果您需要更多解释,请参阅计算机网络课程。