在多个可供读取的套接字中进行选择

发布于 2024-11-30 06:02:47 字数 155 浏览 1 评论 0原文

我正在编写一个服务器客户端应用程序。我有一个服务器,其中包含从 ServerSocket 的accept() 方法获得的多个套接字。我想从这些套接字读取数据,但我不一定知道哪个套接字已准备好读取。我需要某种选择器来选择一个准备好读取的套接字,这样我就可以读取它发送的数据。

谢谢。

I am writing a server-client application. I have a server that holds several sockets that I have got from the accept() method of ServerSocket. I want to read from these sockets but I don't necesserally know which socket is ready to be read from. I need some kind of selector that will select one of the sockets that are ready to be read from, so I can read the data it sends.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吹泡泡o 2024-12-07 06:02:47

基本上有两个选项可以使其工作:

  1. 每个接受的套接字都有专用的线程。这是因为“常规”套接字 I/O 处于阻塞状态。您无法使用单个线程有选择地处理多个套接字。由于没有“窥视”功能,因此当您调用 read 时,您始终会面临被阻止的风险。通过让您感兴趣的每个套接字都有一个线程,阻塞读取不会阻塞任何其他操作(线程)。
  2. 使用蔚来。 NIO 允许异步 I/O 操作,基本上正是您所要求的 - 选择器

如果您确实决定采用 NIO 方式,我建议您查看 MINANetty。我发现它们比普通的 NIO 更容易使用。您不仅会获得更好的 API 来使用,而且至少 MINA 还针对一些令人讨厌的 NIO 错误提供了解决方法。

You have basically two options to make it work:

  1. Have dedicated thread per accepted socket. This is because the 'regular' socket I/O is blocking. You can not selectively handle multiple sockets using a single thread. And as there is no 'peeking' functionality, you will always take a risk of getting blocked when you invoke read. By having a thread per each socket you are interested in reading, blocking reads will not block any other operations (threads).
  2. Use NIO. NIO allows for asynchronous I/O operations, and basically exactly what you asked for - a Selector.

If you do decide to go NIO-way, I would recommend checking out MINA and Netty. I've found them much easier to work with than plain NIO. Not only will you get a nicer API to work with, but at least MINA had workarounds for some nasty NIO bugs, too.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文