Java:serversocket和datagramsocket有什么区别?

时间:2015-01-01 11:26:15

标签: java tcp udp

基本上我是java中服务器和客户端编程的新手,我谷歌所有必要的资源来学习这个特定的主题,但是我不明白它们之间的区别。

到目前为止,我对这两者的理解是,他们都可以处理客户请求,但我需要进一步了解每个类的好处,以及何时可以有效使用它的具体情况或特定情况。

例如,我有一个服务器客户端程序,它是团队查看器的一个子集,客户端程序必须在每毫秒内向服务器发送屏幕截图,而服务器将从另一个连接的客户端发布它。代码正在运行,但我发现ServerSocket消耗了大量的Heap,尽管它也成功地提供给服务器和客户端。我还阅读了一个与我的问题相关的博客(链接丢失),表明DatagramSocket是解决方案,因为它不执行Handshakes。

我真的很关心这些课程的好处和缺点。

2 个答案:

答案 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​​,则内存开销应该是无关紧要的。

我的猜测是您正在执行以下一项或多项操作:

  1. 为每个客户端/服务器交互打开新连接
  2. 在服务器端,为每个连接创建一个新线程
  3. 未关闭连接。
  4.   

    我还读了一篇与我的问题相关的博客(链接丢失),表明DatagramSocket是解决方案,因为它不会执行Handshakes。

    1. 握手不会导致大量内存消耗。
    2. 默认情况下,TCP / IP堆栈通常不会进行握手。

答案 1 :(得分:0)

你说你已经看过google了,但google上有几个页面可以直接解决你的问题。有几个与您的问题具有相同的标题。您甚至表示通过在问题上使用[tcp]和[udp]标记了解它们之间的一些区别。

区别在于使用TCP通信协议,而使用UDP通信协议。也许您的问题不是关于Java,而是关于互联网,计算机网络和通信协议如何工作?

  • TCP是一种面向连接的可靠传送协议。
  • UDP是一种无连接的不可靠传送协议。

这意味着你必须决定哪个是重要的,速度或可靠性。

数据是否在传输过程中不得损坏?如果是,则必须使用TCP或serversocket。

如果数据必须通过最快的方法到达,即使有丢失的风险,那么您必须使用UDP或datagramsocket。

如果您需要更多解释,请参阅计算机网络课程。