问题标签 [qtcpserver]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2495 浏览

multithreading - 如何在多个线程中使用 QTCPServer?

我正在尝试编写一个同时处理来自多个客户端的请求的网络服务器。按照它的设计方式,一次只能处理一个请求。

我需要的是一种调用方法nextPendingConnection(),然后将连接分派到单独的线程进行处理。

有没有办法做到这一点?

0 投票
2 回答
762 浏览

c++ - QTcpServer 检索多个地址

我将 Qt-Framework 中的QTcpServer与 C++ 一起使用。

我开始了

我从中检索地址。这是 0.0.0.0。在我看来,它应该监听多个地址(如 127.0.0.1 和 LAN 地址)。

有没有办法从这个类中检索多个地址?

0 投票
3 回答
3809 浏览

windows - QT QTcpServer telnet 获取字符 \r\n

我正在写一个QTcpServer. 我用作telnet.exe测试的客户端。在新的客户端连接上,我的服务器向Hi!显示的客户端发送一条消息 - 到目前为止一切都很好。

但是当我在telnet.exe窗口中输入内容时,每个字符readyRead()都会发出a 。我只希望它在之后发送!有什么问题?这是Windows的本质吗?因为我在我的 linux 机器上使用过,它只在 之后发送字符串,正如预期的那样。\r\ntelnet.exetelnet\r\n

0 投票
2 回答
920 浏览

c++ - Qt - 一个简单的回显服务器

在 Qt 中,您如何在 QThreadPool 中保持线程处于活动状态;据我所见,只有一个运行 QRunnable 的选项,我被告知他们无法控制它们所在的线程。我将如何使用线程池使套接字保持活动状态并准备好读写?

0 投票
2 回答
3675 浏览

qt - 我只是无法让 QTcpServer 工作(从未调用过 newConnection)

我知道有人问过与此类似的问题,但我还没有找到解决我问题的答案。

我正在调整一些现有的 Qt 代码,以将服务器功能添加到我公司使用的程序中。为此,我在现有对话框中添加了一个 QTcpServer 对象,调用 listen() 并将一个插槽连接到 newConnection 发射器,例如:

主要是:

new_Connection() 永远不会被调用,所以我看不到相关性,但它是:

这很好用,因为我的程序开始侦听指定的端口,如果我通过 telnet 连接到它,它建立的各种连接,但从未调用过 new_Connection()!

我已经看到关于这个问题的帖子可以追溯到 2005 年,所以这显然不是一个新事物,但我还没有找到对这个问题的满意答案(或实际上任何答案)。这让工作中的每个人都感到困惑,即使是编写 Qt 服务器程序的人。我猜测现有框架存在根本性错误,但我不知道它可能是什么。

我已经为此扯了一天半的头发,而我成功的关闭是使用 waitForNewConnection() ,它实际上会给我一个套接字,但是当我连接到 readReady() 发射器时,那从来没有也被解雇了。那么什么会阻止这些信号永远不会被调用呢?

请放过我的理智,并尽可能地帮助我。

0 投票
1 回答
1479 浏览

qt - QTcpServer - QTcpSocket 确认问题

-->我正在使用QTcpSocket,QTcpServer编写程序。我是否需要添加一些代码(即确认程序)来保证数据包被传递?
如果是这种情况,我在网上找不到类似的东西,因此想看看一些例子,拜托。

--> 或者在某个地方的 QT 库中,这些已经被覆盖,所以我不需要这样的东西?

任何帮助将不胜感激。谢谢。

编辑:现在,我在问如何将标题与我在下面添加的 QDataStream 块一起使用。我希望每个块都有标题来告诉信息。这样我就可以跟踪写了哪些部分,哪些部分丢失了。请看下面。

0 投票
1 回答
9634 浏览

c++ - 获取远程主机IP地址QTcpServer

我正在使用 Qt 使用 QTcpServer 创建 TCP 服务器。每次客户端连接到服务器时,我都想知道远程主机的 IP 地址和端口号。我尝试搜索文档,但找不到有关此主题的任何信息。

我知道应该有办法,我只是无法弄清楚。请帮忙。

0 投票
1 回答
8969 浏览

python - PyQt QTcpServer:如何向多个客户端返回数据?

我希望使用 PyQt 创建一个 QTcpServer,它可以同时将数据返回到 2 个或更多客户端。我认为这将需要线程。

使用 threadedfortuneserver.py 示例作为测试用例(包含在 PyQt4 中,在我的系统上它位于 /usr/share/doc/python-qt4-doc/examples/network 中),我想连接多个客户端,并且每次一个的客户要求发财,其他客户也会收到更新消息,例如“客户 X 刚刚收到了财富 'blah blah blah'”。

我了解财富服务器/客户端程序的工作原理,但似乎在财富发送回客户端后客户端连接立即终止。我的具体问题是:

  1. 是否可以保持所有连接打开,以便每次其中一个客户端请求发财时,其他客户端都可以更新?

  2. 如果是这样,跟踪和循环连接的客户端的最佳方法是什么?

这对我来说是一个严重的绊脚石,因为我想开发一个应用程序,其中多个客户端可以交互,并且每个客户端都可以更新其他客户端的操作。

提前感谢您的帮助,如果我可以提供任何其他信息,请告诉我。

我找到了这个线程,但没有足够的具体信息可供使用。其他讨论是针对 Python 套接字包的,但我的理解是,在使用 PyQt 时,服务器应该是 QTcpServer,所以一切都很好。

*** 编辑 ***

这是我的解决方案的开始阶段。我已经创建了一个基本的服务器和客户端。服务器只是将客户端输入到行编辑框中的内容发回。

我基于“使用 Python 和 Qt 进行快速 GUI 编程”第 18 章中的“buildingservices”示例。

我所做的主要改变是现在线程无限期地运行,它们的套接字保持打开状态,监听客户端发送的数据。

它可以很好地处理多个客户。这当然很难看,但我认为这是一个很好的起点。

我想要的是能够在一个客户输入文本时通知每个客户(比如典型的聊天程序)。

此外,为了让您了解您正在与谁打交道,我不是专业的程序员。我是一名物理学家,多年来一直在编写散漫的脚本和摆弄我的腰带。但我想尝试开发可以传递数据的基本服务器/客户端程序。

感谢您的任何帮助或建议!

服务器:

客户:

0 投票
1 回答
2154 浏览

c++ - 具有大量同时客户端的慢 QTcpServer

我正在用 Qt 编写 TCP 服务器,它将为大文件提供服务。应用逻辑如下:

  1. 我将 QTcpServer 子类化并重新实现了incomingConnection(int)
  2. 在incomingConnection 中,我正在创建“Streamer”类的实例
  3. “Streamer”正在使用 QTcpSocket,它使用来自incomingConnection 的 setSocketDescriptor 初始化
  4. 当来自客户端的数据到达时,我从 readyRead() 插槽中发回初始响应,然后将套接字的信号 bytesWritten(qint64) 连接到 Streamer 的插槽 bytesWritten()

bytesWritten 看起来像:

所以基本上我只在所有待处理数据都完全写入时才写入新数据。我认为这是最异步的方式。

一切正常,除了当有很多同时客户端时它会很慢。

大约有 5 个客户端 - 我从该服务器下载,速度约为 1 MB/s(我的家庭互联网连接的最大值)

拥有大约 140 个客户端 - 下载速度约为 100-200 KB/s。

服务器的互联网连接速度为 10 Gbps,有 140 个客户端,它的使用速度约为 100 Mbps,所以我认为这不是问题。

服务器的内存使用量与 140 个客户端 - 100 MB 的 2GB 可用

服务器的 CPU 使用率 - 最高 20%

我使用的是 800 端口。

当端口 800 上有 140 个客户端并且通过它的下载速度为 100-200 KB/s 时,我在端口 801 上运行了单独的副本,并且以 1 MB/s 的速度下载没有问题。

我的猜测是,不知何故,Qt 的事件调度(或套接字通知器?)太慢而无法处理所有这些事件。

我试过了:

  1. 使用 -O3 编译整个 Qt 和我的应用程序
  2. 安装libglib2.0-dev并重新编译Qt(因为QCoreApplication使用的是QEventDispatcherGlib或者QEventDispatcherUNIX,所以想看看有什么不同)
  3. 使用 streamer->moveToThread() 生成几个线程并在incomingConnection(int) 中取决于当前在特定线程中的客户端数量 - 这没有做出任何改变(尽管我观察到速度变化更大)
  4. 使用生成工作进程

代码:

然后在主进程中启动 QLocalServer 并将 socketDescriptors 从incomingConnection(int socketDescriptor) 传递给工作进程。它工作正常,但下载速度仍然很慢。

也试过:

  1. incomingConnection() 中的 fork()-ing 过程 - 这几乎杀死了服务器:)
  2. 为每个客户端创建单独的线程 - 速度降至 50-100 KB/s
  3. 将 QThreadPool 与 QRunnable 一起使用 - 没有区别

我正在使用 Qt 4.8.1

我没有主意了。

是与 Qt 相关还是与服务器配置有关?

或者也许我应该使用不同的语言/框架/服务器?我需要为文件提供服务的 TCP 服务器,但我还需要在数据包之间执行一些特定任务,所以我需要自己实现那部分。

0 投票
1 回答
1955 浏览

c++ - 连接(在 QT 项目中)不起作用

我开始使用 QT 库创建我的第一个多线程应用程序。

按照关于 QTcpServer 和 QTcpSocket 的 qt 指南,我编写了一个服务器应用程序,它使用这个构造函数创建连接:

这是incomingConnection() 函数,它在每次新客户端尝试连接时创建一个新线程:

现在,这是 MyThreadClass:

代码编译正常,但是当我启动客户端(启动服务器后)时,服务器收到以下错误:

然后服务器无法接收客户端的数据。

有谁有想法吗?

提前感谢丹尼尔