添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我们经常看到说,TCP 是一对一的两点服务,UDP 支持一对一、一对多、多对多的交互通信。但是使用Tcp工具通讯时,一个Tcp服务端可以连接多个Tcp客户端。所以这里的一对一和一对多是不是冲突了?

并不是 。一对一指的是Tcp连接,什么是Tcp连接,这里直接粘贴 小林大神 的解释。
Tcp连接
这些控制信息的组合可以称为连接 。那么一对一的意思就是一个控制信息的组合只能针对一个Tcp客户端。

那么 Tcp工具 是如何实现一对多的通讯的呢?

工具一对多
我这里使用工具建立了一个TCP服务端(5679)和两个TCP客户端(6159和6259)。
网上我看有人解释这个问题是,说是tcp服务端处理多个连接时,内部又创建了新的端口来处理。错!!!我们看下windows上tcp套接字信息就知道了
套接字信息
这里套接字指的是如通信对象的 IP 地址、端口号、通信操作的进行状态等信息。 图中一行相当于一个套接字。为什么需要套接字概念,讲到一对多的实现时就知道了。

可以看到tcp服务端的端口一直都是5679,并没有其他端口显示,所以tcp服务端一直只有一个端口!!!

那tcp服务端是如何处理多用户的连接的呢?

先说结论,服务端的Socket程序做了处理。 所以TCP是一对一,Socket实现了一对多

服务端的socket程序分成两个模块,即等待连接模块和负责与客户端通信的模块 。当服务器程序启动并读取配置文件完成初始化操作后,就会运行等待连接模块。这个模块会创建套接字,然后进入等待连接的暂停状态。接下来,当 客户端连发起连接时,这个模块会恢复运行并接受连接,然后启动客户端通信模块,并移交完成连接的套接字。接下来,客户端通信模块就会使用已连接的套接字与客户端进行通信,通信结束后,这个模块就退出了。
多个客户端连入
套接字复制
在复制出一个新的套接字之后,原来那个处于等待连 接状态的套接字会怎么样呢?其实它还会以等待连接的状态继续存在,当再次调用 accept,客户端连接包到 达时,它又可以再次执行接受连接操作。接受新的连接之后,和刚才一样,协议栈会为这个等待连接的套接 字复制一个新的副本,然后让客户端连接到这个新的副本套接字上。

更详细的原理见下图
通讯图
非常建议去看《网络是怎样连接的》。其他不说了有问题可以多交流。

下面给出 一对多 一个 服务器 多个 客户端 的收发消息关系图。下图表示,创建了三个与 客户端 对话的Communication层,每个 客户端 分别与各自对应的线程通话,从而实现 一对多 通信
一个 端口 到底可以建立多少 TCP 连接 ? 这是 一个 很基础的问题,但是网上对于这个问题的解释千奇百怪。 有人说, 一个 端口 只能建立 一个 TCP 连接 ,所以说无论服务还是 客户端 都最多只能建立65535个 TCP 连接 。还有人说, 服务端 因为accept之后新建立的 socket 是重用listen的 端口 的,所以 服务端 最多可以建立65535×n个 连接 ,而 客户端 connect建立的 端口 不可重用所以 客户端 只能65535。 这里有两个误解: 误解一: 一个 端口 只能建立 一个 TCP 连接 。事实上Linux内核对 TCP 连接 的识别是通过四元组来区分,
服务端 客户端 T 一对一 TCP 的基础上增加几条通信即可,要求各个 连接 可同时进行通信因此使用多线程。 主线程在listen实现后,使用 一个 for 循环一直循环等待 客户端 连接 请求,将每次 连接 标记(sockFd)保存作为开启检测(检测条件可修改,我写的这个检测貌似也没啥用(▼ヘ▼#))。 每次 连接 都会开启 一个 线程用于和 客户端 的通信(也是使用 for 循环进行数据的接收、 处理 、发送),数据接收使用阻塞等待。 通信的具体实现,在开发板上部署运行下方..
# 处理 客户端 请求的任务 def client_request( ip _port,new_client): print(' 客户端 ip 地址和 端口 号:', ip _port) # 5.接收 客户端 数据 # 收发消息都使用返回新的套接字 while True: #循环接收 客户端 的数据 recv_data = ...
Q Tcp Server 用于接收到来的 TCP 连接 端口 号即可指定,也可由Q Tcp Server 自动选取 一个 。 既可在设备上指定的 IP 地址上监听,也可在设备上所有 IP 地址上监听。 调用Listen()让 服务端 监听到来的 连接 。当 一个 客户端 连接 服务端 时, 一个 newConnection()信号随后发出。 调用nextPendingConnection()去接收等待的Q Tcp Socket 连接 。函数返回 一个 QAbstract Socket ::ConnectedState状态的Q Tcp Socket 对象指针,用于与 客户端 通信
在Qt中,可以使用Q Tcp Socket 和Q Tcp Server 类来实现 TCP 连接 多个 客户端 。下面是一种实现方法: 首先,创建 一个 Q Tcp Server 对象来监听 客户端 连接 : ```cpp Q Tcp Server server ; server .listen(QHostAddress::Any, 1234); // 监听本地 端口 1234 然后,在有新 客户端 连接 时,使用Q Tcp Server 的newConnection信号槽将其 连接 一个 新的Q Tcp Socket 对象: ```cpp connect(& server , &Q Tcp Server ::newConnection, [=]() { Q Tcp Socket * socket = server .nextPendingConnection(); // 将 socket 添加到 一个 容器中,以便管理 多个 客户端 连接 接下来,可以使用Q Tcp Socket 对象与 客户端 进行通信。可以在readyRead信号槽中 处理 接收到的数据,以及在disconnected信号槽中 处理 客户端 断开 连接 的情况: ```cpp connect( socket , &Q Tcp Socket ::readyRead, [=]() { QByteArray data = socket ->readAll(); // 处理 接收到的数据 connect( socket , &Q Tcp Socket ::disconnected, [=]() { // 处理 客户端 断开 连接 的情况 socket ->deleteLater(); // 清理资源 需要注意的是,在进行通信的过程中,可以根据具体需求设置超时时间、发送和接收数据等各种细节的 处理 。 另外,为了管理 多个 客户端 连接 ,可以将Q Tcp Socket 对象添加到 一个 容器中,例如使用QList或QVector等容器类。 以上是大致的实现思路,具体的细节和错误 处理 可以根据项目需求进行调整。 ### 回答2: Qt是一款跨平台的开发框架,拥有丰富的 网络 编程功能。要实现 TCP 连接 多个 客户端 ,可以采用Qt的Q Tcp Server 和Q Tcp Socket 类。 首先,创建 一个 Q Tcp Server 对象,并调用其listen()函数,指定 服务端 的监听地址和 端口 号。然后,在新的 客户端 连接 到服务器时,Q Tcp Server 会触发newConnection()信号。我们可以通过 连接 这个信号来 处理 新的 客户端 连接 处理 连接 的槽函数中,我们可以创建 一个 Q Tcp Socket 对象,用于与 客户端 进行通信。通过调用Q Tcp Server 的nextPendingConnection()函数,可以获取到与 客户端 连接 的Q Tcp Socket 对象。可以为每个 客户端 连接 创建 一个 新的Q Tcp Socket 对象。 为了 处理 多个 客户端 连接 ,我们可以使用 一个 QList或QVector来存储所有的Q Tcp Socket 对象。在 处理 连接 的槽函数中,将新的Q Tcp Socket 对象添加到列表中。这样我们就可以通过遍历列表,对每个 客户端 进行操作。 当 服务端 从某个 客户端 接收到数据时,可以通过connected()信号与readyRead()信号来读取数据。当 服务端 要发送数据给 客户端 时,可以调用Q Tcp Socket 的write()函数。 如果某个 客户端 断开 连接 ,Q Tcp Socket 会触发disconnected()信号,我们可以在该信号的槽函数中将对应的Q Tcp Socket 对象从列表中移除,并释放内存。 为了确保 多个 客户端 可以同时进行 连接 和通信,可以使用多线程或者多线程框架(如QtConcurrent)来实现。每个 客户端 连接 可以在 一个 单独的线程中进行 处理 。 总的来说,Qt提供了丰富的功能来 处理 TCP 连接 多个 客户端 。我们可以通过Q Tcp Server 和Q Tcp Socket 类来实现 服务端 多个 客户端 之间的通信,使用容器来存储 多个 客户端 连接 对象,并使用多线程来 处理 多个 客户端 的并发 连接 。 ### 回答3: 在Qt中实现 TCP 连接 多个 客户端 ,我们可以使用Qt的 网络 模块来 处理 。 首先,我们需要创建 一个 Tcp Server 对象来接受 客户端 连接 请求和 处理 数据传输。 然后,我们可以使用QObject的connect方法将 Tcp Server 的newConnection信号与自定义的槽方法 连接 起来。在槽方法中,我们可以获取到新 连接 Socket Descr ip tor,并创建 一个 Tcp Socket 对象来 处理 客户端 的通信。 在 Tcp Socket 对象中,我们可以使用QObject的connect方法将 Tcp Socket 的readyRead信号 连接 到自定义的槽方法上。在槽方法中,我们可以获取到 客户端 发送的数据,并进行相应的 处理 。 此外,我们还可以使用QObject的connect方法将 Tcp Socket 的disconnected信号 连接 到自定义的槽方法上,用于 处理 客户端 断开 连接 的情况。 在main函数中,我们可以创建 多个 Tcp Socket 对象,并 连接 到同 一个 Tcp Server 对象上,从而实现 多个 客户端 同时 连接 的功能。 最后,我们可以通过 Tcp Socket 的write方法向 客户端 发送数据,也可以通过 Tcp Socket 的close方法主动关闭与 客户端 连接 。 通过以上步骤,我们就可以实现Qt中 TCP 连接 多个 客户端 的功能。