我可以在单线程中使用两个套接字吗?

Posted

技术标签:

【中文标题】我可以在单线程中使用两个套接字吗?【英文标题】:Can I use two sockets in single thread? 【发布时间】:2015-12-02 09:37:19 【问题描述】:

我在开发包含文件共享的聊天应用程序时遇到问题。它是一个基于服务器和客户端的桌面应用程序。我能够单独开发聊天和文件共享。

现在我想合并两个项目并遇到问题。是否可以像主线程一样在单线程中使用多个套接字?还是我必须使用一个用于聊天,另一个用于文件共享?

【问题讨论】:

听起来你没有任何特定的协议,有一个好的协议,你可以用一个服务(socket)做数百万 【参考方案1】:

是的,单个线程可以使用多个套接字。见Selector API.

基本思想是线程中的代码需要知道它需要读取或写入的所有可选通道(套接字、打开的文件等)。它使用选择器注册通道。然后您拨打select 电话,该电话将(例如)阻塞,直到其中一个已注册频道准备就绪;例如现在可以读取数据的套接字......而不会阻塞。

这很复杂,但我建议您阅读 Baeldung 的 Introduction to the Java NIO Selector,其中包含一个示例,而不是在这里全部解释。

但最重要的是,使用Selector 可能需要对现有代码进行重大重组。如果您的代码使用(例如)第 3 方库来执行 I/O,那么这种方法可能行不通。使用多个线程可能是一个更简单的选择。

【讨论】:

【参考方案2】:

我认为这是可能的,但在同一个线程中,一个套接字的一个操作必须等待另一个完成的所有操作。如果您希望这两个操作同时执行,请在不同的线程中执行。 希望有帮助:)

【讨论】:

以上是关于我可以在单线程中使用两个套接字吗?的主要内容,如果未能解决你的问题,请参考以下文章

ZMQ 套接字不是线程安全的,但我可以在不同的线程中使用 zmq_send() 和 zmq_recv() 吗?

使用 ZeroMQ Socket 时,我可以从一个线程 send() 并从另一个线程发送 recv() 到同一个套接字吗?

可以在多个线程中使用 WSAEventSelect() 来增加套接字限制吗?

客户端可以同时有两个连接到同一个套接字侦听器吗?

从套接字和 STDIN 提升 Asio 多线程

非阻塞套接字轮询与阻塞套接字