Java:serversocket和datagramsocket有什么区别?

nef*_*tou 3 java udp tcp

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

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

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

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

Ste*_*n C 11

A ServerSocket用于接受某些流协议上的传入网络连接; 例如TCP/IP.

A DatagramSocket用于在某些无连接数据报/消息协议上发送和接收数据报; 例如UDP/IP


补充问题:

基本上什么是数据报

数据报是在单个逻辑数据包中发送的一堆信息.例如,UDP数据包.

这是否意味着数据报=轻量级数据包?

这取决于你对轻量级的定义!

UDP数据报作为IP数据包发送.如果UDP数据报对于IP数据包来说太大,则发送方将其分成多个IP数据包并由接收方重新组装.

什么是无连接[mean],

这意味着两方之间不存在逻辑连接.如果UDP数据报的组件IP包丢失,则UDP数据报丢失.接收者永远不知道(在应用程序级别).UDP中没有报告数据丢失和重试.这是典型的"无连接"行为.

这是否意味着数据在传输过程中可能会丢失?

基本上,是的.如果您希望在数据报或您应该使用ServerSocket和Socket的事件中传输可靠/无损数据; 例如TCP/IP流.

但请注意,即使使用(裸)TCP/IP流,也无法保证数据传输:

  • 如果网络出现故障,或者发送方或接收方出现故障,则在数据传输过程中可能会断开连接.这将导致数据丢失......对于该连接.(套接字不支持重新连接.)如果发送方和/或接收方仍处于活动状态,通常会通知它们连接已断开,但他们不知道原因,或者传输中丢失了多少数据.

  • 数据在传输过程中可能会以TCP/IP的错误检测无法发现的方式被破坏.接收者不会知道这已经发生了.

这两个问题都可以在应用程序协议级别解决; 例如,对第一个和强加密使用消息队列,对第二个使用强校验和.


关于你的尝试使用ServerSocket.

代码正在运行,但我发现它ServerSocket消耗了很多Heap,尽管它也成功地提供给服务器和客户端.

你做错了什么.如果适当地使用API​​,则内存开销应该是无关紧要的.

我的猜测是你正在做以下一项或多项工作:

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

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

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