单个线程接收10W左右的socket如何处理?

a225518a 2014-08-22 04:04:02
我做了一个测试,服务器用单个线程可以接收10W以上的socket,那么对于这些socket用轮询的方式处理,如果前面的socket没有处理好,后面的socket会处于什么状态?(等待处理么?)
...全文
286 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
skgary 2014-08-25
  • 打赏
  • 举报
回复
引用 10 楼 ygycomon 的回复:
[quote=引用 7 楼 skgary 的回复:] [quote=引用 1 楼 ygycomon 的回复:] socket有什么状不状态的,数据放在缓冲区里,等着上层来取,如果缓冲区满了就丢弃
这种说法是不完全正确的。 udp的会丢,但TCP的不会丢 ,数据在缓冲区里,但是应用不来存的话,会减少TCP的window。 window一旦减少到0,那发送方就不会再发送数据。 这个你可以看TCP协议里的拥塞控制。[/quote] 不止是接收端的缓冲区吧,中间的路由设备,在拥堵的情况下tcp也会丢数据的吧[/quote] TCP在路由设备的丢包在操作系统这一层就可以解决 UDP直接丢 另,这种情况和楼主说的情况无关,路由器仅仅在超过物理限制(如网线,NPE设计速率)的时候才会丢包。
致知Fighting 2014-08-25
  • 打赏
  • 举报
回复
引用 7 楼 skgary 的回复:
[quote=引用 1 楼 ygycomon 的回复:] socket有什么状不状态的,数据放在缓冲区里,等着上层来取,如果缓冲区满了就丢弃
这种说法是不完全正确的。 udp的会丢,但TCP的不会丢 ,数据在缓冲区里,但是应用不来存的话,会减少TCP的window。 window一旦减少到0,那发送方就不会再发送数据。 这个你可以看TCP协议里的拥塞控制。[/quote] 不止是接收端的缓冲区吧,中间的路由设备,在拥堵的情况下tcp也会丢数据的吧
skgary 2014-08-24
  • 打赏
  • 举报
回复
最后,楼主这个深奥的问题,30分太少了点。。。 哈哈
skgary 2014-08-24
  • 打赏
  • 举报
回复
引用 楼主 a225518a 的回复:
我做了一个测试,服务器用单个线程可以接收10W以上的socket,那么对于这些socket用轮询的方式处理,如果前面的socket没有处理好,后面的socket会处于什么状态?(等待处理么?)
如果是TCP的话,会不断的堆在缓冲区里,只要socket 的缓冲区还有空间,相应socket 的发送方仍然可以发送数据。 但缓冲区满之后,后面的socket会处于阻塞状态,发送方不可以再发送数据。 如果缓冲区满之后,接收方的数据长期得不到处理(通常为120s),发送方就得不到window update,会引起TIMEOUT,然后会断开。 如果你做到单服务器10W的话,我猜你多数是linux的系统,你多找些unix/linux下面的socket开发的资料看看。 java的nio只是对这些东西封装而已。
skgary 2014-08-24
  • 打赏
  • 举报
回复
引用 1 楼 ygycomon 的回复:
socket有什么状不状态的,数据放在缓冲区里,等着上层来取,如果缓冲区满了就丢弃
这种说法是不完全正确的。 udp的会丢,但TCP的不会丢 ,数据在缓冲区里,但是应用不来存的话,会减少TCP的window。 window一旦减少到0,那发送方就不会再发送数据。 这个你可以看TCP协议里的拥塞控制。
wyx100 2014-08-24
  • 打赏
  • 举报
回复
引用 5 楼 zhouren1314 的回复:
不断的切换, 至于那个是当前运行,就看那个抢到 资源和运行的条件。。有一点 随机性
乔不思 2014-08-24
  • 打赏
  • 举报
回复
不断的切换, 至于那个是当前运行,就看那个抢到 资源和运行的条件。。有一点 随机性
致知Fighting 2014-08-23
  • 打赏
  • 举报
回复
引用 2 楼 a225518a 的回复:
[quote=引用 1 楼 ygycomon 的回复:] socket有什么状不状态的,数据放在缓冲区里,等着上层来取,如果缓冲区满了就丢弃
那我想问,用轮询处理这单个线程里的所有线程,前面的线程处理了,后面的线程怎么办?[/quote] 没看懂,什么叫单个线程里的所有线程 不是单线程么,又怎么有前面的线程后面的线程
kloen1984126 2014-08-22
  • 打赏
  • 举报
回复
完成端口模型, 没有之一
a225518a 2014-08-22
  • 打赏
  • 举报
回复
引用 1 楼 ygycomon 的回复:
socket有什么状不状态的,数据放在缓冲区里,等着上层来取,如果缓冲区满了就丢弃
那我想问,用轮询处理这单个线程里的所有线程,前面的线程处理了,后面的线程怎么办?
致知Fighting 2014-08-22
  • 打赏
  • 举报
回复
socket有什么状不状态的,数据放在缓冲区里,等着上层来取,如果缓冲区满了就丢弃

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧