java 。它总是以缓冲区大小发送吗?

标签 java multithreading sockets buffer serversocket

使用Java套接字时,消息总是以缓冲区大小长度发送吗? (当我只发送 300 字节时,是否无论如何都会以 1024 字节大小的包发送?) 多大的缓冲区是最佳选择? 512 字节和 8k 字节大小有什么区别?

我不想创建几个线程,所以我会在这里问。 java 标准 tcp 服务器套接字性能是否足以以 10-20 msg/s 平滑处理 100 个连接?

最佳答案

大多数机器的 MTU 为 1500 字节。这意味着如果您发送其中的多个,它会将其分成数据包。如果少于这个,它可能会保留数据一小段时间,看看是否会发送更多数据,以减少发送小数据包的开销。有关更多信息,请参阅 Nagle 的算法。

一次发送 16 批 512 字节或 8 KB 的数据没有太大区别,因为操作系统和网络适配器默认会进行一些合并。

真正重要的是您和另一端之间的连接带宽。如果每秒最多有 2000 条消息且消息大小为 512 字节,则需要 10 Mbit/s 线路 (2000*512*8 = ~8 Mbit)

就数量而言,大约 10,000 个连接或每秒大约 500,000 条消息应该不会有问题。如果您有 1 Gbit/s 的线路,您应该能够轻松获得 100 MB/s 的速度。如果您有 10 Gbit/s 线路,您应该能够获得更多带宽,但除非您小心,否则您可能会在使用所有带宽时遇到麻烦。

关于 java 。它总是以缓冲区大小发送吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25824663/

相关文章:

C++ - CreateThread 错误

c++ - Linux 线程函数中的局部变量?

javascript - Sails.js 简单的私有(private)消息传递(发布/订阅和模型)

sockets - FTP 服务器如何恢复下载?

java - 从 ResourceBundle 中获取整数时,整数会被格式化为逗号

java - setPreferredSize 不起作用

java - JOptionPane 或更好的解决方案

c - 套接字 : listen with backlog and accept

java - 带有 CAS 的 Spring Security 跳过 session 固定保护

Java JDBC 与 mySql - 从表传递 id