java - Java套接字中的函数 'receive'是如何设计的?

标签 java sockets

众所周知,我们使用与以下代码类似的代码来使用 UDP 套接字接收数据包:

DatagramSocket s = new DatagramSocket();
byte[] buf = new byte[1024];
DatagramPacket p = new DatagramPacket(buf, buf.length);
s.receive(p);

我想知道为什么函数 receive() 宁愿设置传递的数据包而不是返回数据包对象。

为什么这个API要这样设计?这样的设计方法有什么优点,有什么缺点?

最佳答案

当您查看代码时,您会发现“用户”定义了 buffer 数组,套接字稍后将使用该数组来实际存储数据。

因此,此 API 的用户可以完全控制将使用的内存/缓冲区。

当然,这也使得使用该界面变得“更加复杂”。但是,当您处理此类低级界面时,您很可能希望能够控制此类微妙的细节。

含义:当您进入“我自己实现数据报协议(protocol)实现”的境界时,您就会真正知道为什么要这样做。那么“更多程度”的自由就是一件好事。

或者,JB Nizet 的解释也是合理的:这个 API 基本上已经有 17 多年的历史了。这很可能是当时人们使用 C/C++ 所做的事情的简单“复制”。

从那里开始:如果有人要为此目的创建一个“新鲜”API,那么现在它很可能看起来会大不相同并且更加“抽象”。

关于java - Java套接字中的函数 'receive'是如何设计的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46973906/

相关文章:

java - 如何使用 JUNG 的注释系统注释我的图表?

c++ - TCP端口访问和C++

python - 使用 Python 从 Unix 套接字连接读取和写入

apache-flex - 首选的套接字策略文件服务器实现?

ios - 使用 Socket.io 无法在两个 IOS 设备之间接收消息

java - 如果我使用多个 catch block ,为什么 java 没有检测到无法访问的 catch block ?

java - 使用 Java 对 parent 和 child 进行排序

java - java中split()和contains()之间使用正则表达式有什么区别

java - 使用 Java 7/Eclipse 3.7.1 的 headless pde 构建失败

javascript - 图表总是空的