- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对Qt和套接字编程都很陌生。
我正在尝试编写一个简单的TCP服务器/聊天应用程序,但是readyRead()
或“接收”部分位于它自己的线程中。我使用UDP进行了此“工作”,但由于某些原因,TCP套接字无法以相同的方式工作。
我很乐意接受其他建议,因为我可能会以错误的方式解决此问题。我最终将使这个应用程序监听来自嵌入式系统的连续输入,读取和写入命令以及从系统中接收“心跳”。
我一直在关注Voidrealms的YouTube教程,并且一直在实现“正确的方法”线程。但是由于 protected ,我现在无法运行qThread::exec()
。
因此,基本上我想在不同的线程中使用sender
和receiver
,以便sender
不会阻止receiver
,反之亦然。
我将仅发布TCP服务器代码和正常工作的UDP代码以供引用。
tcpserver.h
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QObject>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>
#include <QThread>
class TCPServer : public QObject
{
Q_OBJECT
public:
explicit TCPServer(QObject *parent = nullptr);
void SendData();
void DoSetup(QThread &cThread);
// void readyRead();
bool conn;
signals:
public slots:
void newConnection();
void readyRead();
void DoWork();
private:
QTcpServer *server;
QTcpSocket *socket;
};
#endif // TCPSERVER_H
#include "tcpserver.h"
#include <QThread>
TCPServer::TCPServer(QObject *parent) : QObject(parent)
{
this->conn =0;
server = new QTcpServer(this);
connect(server,SIGNAL(newConnection()),this,SLOT(newConnection()));
//telnet 169.254.55.237 1234
if(!server->listen(QHostAddress("169.254.55.237"),1234)){
qDebug() << "Server not started";
}
else{
qDebug() << "server started";
}
}
void TCPServer::DoSetup(QThread &cThread){
connect(&cThread,SIGNAL(started()),this,SLOT(DoWork()));
}
void TCPServer::DoWork(){
qDebug() << "Running Thread";
connect(this->socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
void TCPServer::SendData(){
while(1){
QByteArray Data;
Data.append("Server: ");
QTextStream s(stdin);
QString value = s.readLine();
Data.append(value);
this->socket->write(Data);
//this->socket->write("hello client\r\n");
this->socket->flush();
this->socket->waitForBytesWritten(3000);
}
}
void TCPServer::newConnection(){
this->socket = server->nextPendingConnection();
//connect(this->socket,SIGNAL(readyRead()),this,SLOT(readyRead()));
this->conn =1;
this->SendData();
//this->socket->close();
}
void TCPServer::readyRead(){
// while(1){
if(this->conn){
qDebug()<< "Reading...";
qDebug()<< this->socket->readAll();
}
}
#include <QCoreApplication>
#include "tcpserver.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QThread cThread;
TCPServer mServer;
mServer.DoSetup(cThread);
mServer.moveToThread(&cThread);
cThread.start();
return a.exec();
}
// myudp.h
#ifndef MYUDP_H
#define MYUDP_H
#include <QObject>
#include <QUdpSocket>
#include <QDebug>
#include <QThread>
class MyUDP : public QObject
{
Q_OBJECT
public:
explicit MyUDP(QObject *parent = nullptr);
void HelloUDP();
void DoSetup(QThread &cThread);
//void readyRead();
signals:
public slots:
void readyRead();
void DoWork();
private:
QUdpSocket *socket;
};
#endif // MYUDP_H
// myudp.cpp
#include "myudp.h"
MyUDP::MyUDP(QObject *parent) :
QObject(parent)
{
// create a QUDP socket
socket = new QUdpSocket(this);
socket->bind(QHostAddress(" 169.254.55.237"), 1234);
//connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
void MyUDP::DoSetup(QThread &cThread){
connect(&cThread,SIGNAL(started()),this,SLOT(DoWork()));
}
void MyUDP::DoWork(){
qDebug() << "Running Thread";
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
void MyUDP::HelloUDP()
{
while(1){
QByteArray Data;
Data.append("Server: ");
QTextStream s(stdin);
QString value = s.readLine();
Data.append(value);
socket->writeDatagram(Data, QHostAddress("169.254.55.237"), 4321);
//socket->writeDatagram(Data, QHostAddress("127.0.0.1"), 1234);
}
}
void MyUDP::readyRead()
{
// if(socket->hasPendingDatagrams()){
// when data comes in
QByteArray buffer;
buffer.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(buffer.data(), buffer.size(),&sender, &senderPort);
qDebug() << "Message from: " << sender.toString();
qDebug() << "Message port: " << senderPort;
qDebug() << "Message: " << buffer;
// }
}
#include <QCoreApplication>
#include <QThread>
#include "myudp.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Server";
QThread cThread;
MyUDP client;
client.DoSetup(cThread);
client.moveToThread(&cThread);
cThread.start();
client.HelloUDP();
return a.exec();
}
最佳答案
在@thuga发表评论表格并进行了一些研究之后,在我看来,不可能(或不建议)在单独的线程中具有读取和写入功能。 QTcpSocket
不是线程安全的。似乎最好的解决方案是在单独的线程中创建辅助函数,这些函数会发出信号以使主线程(或带有QTCPSocket
的线程)执行操作。例如,可以将一个用于从用户读取输入的辅助函数放入一个新线程中,并且当有新数据时,可以发出一个信号,指示该信号可以由QTCPSocket
发送。QTCPSocket
的线程似乎更多地用于在其自己的线程中处理多个连接。
以下链接:
关于qt - Qt TCP服务器在单独的线程中运行readyRead(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52664425/
我正在编写一个多线程服务器,但在“mythraed”类的编译过程中出现以下错误:1) 无法连接 (null)::readyRead() 到 mythread::readyRead()2) 无法连接 (
我正在尝试编写一个小型 UDP 服务器应用程序。 我有一个客户端传输到这个应用程序套接字,我已经使用一个小的 UDP 回显程序(它将端口上接收到的数据回显到屏幕上)验证了它发送正常,而且,我可以看到在
我有一个相对粗糙的设备(两台计算机通过 COM 端口连接),我必须通过 QSerialPort 让它工作。这个想法很简单:数据将通过每个 COM 端口从一个组件发送到另一个组件。发射器工作正常,通过软
因此,我试图让我的 Arduino 与我的 Qt 项目进行通信,但信号 readyRead() 从未由 QSerialPort 发出。我试错了许多方法和命令来实现它,尝试了以下视频中的代码,但它也不起
我在 QByteArray 中从 RS232 接收字节时遇到问题。我连接了 readyread() 信号来调用我的串行端口方法,在其中我正在使用 readAll() 将字节读取到 QByteArray
我正在编写一个从套接字接收数据的 Qt/C++ 程序。我发现我丢失了 readyRead 信号,因为我的插槽分析传入数据的时间太长了。所以现在我已经将它配对到最低限度: void test::inpu
我有 QTcpServer。我想从客户端发送大数据以及如何在服务器接收到所有数据时捕获信号?“while (socket->bytesavailable)”不起作用。 例如: 当 qbytearray
我遇到了 QUdpSocket 的问题。信号 readyRead() 似乎从未发出过。因此,我决定创建 QTimer 并检查套接字读取队列的状态。这样我确保套接字正常工作(bytesAvailable
以下代码旨在显示通过网络发送的图像。我发送了一个 16 字节的 header ,我用它来计算后面的图像大小,然后读取那么多字节并显示图像。我在此链接中使用了这个概念 Tcp packets using
我正在尝试在本地 OSX 10.11 中启动 QLocalServer。 我有客户端尝试循环连接到服务器: int connect(const char* filename) { int sock
我正在尝试弄清楚如何正确使用 Qt TCP 套接字以及多线程。作为一个支持更复杂但类似的东西的测试项目,我想在未来尝试做以下事情:一个简单的应用程序,它要么只监听一个传入连接,要么连接到一个服务器套接
这是我在这个网站上的第一个问题! 我在从一个 COM 端口读取数据时遇到了一些问题,我从另一个 COM 端口发送了一条完整的消息,当我用 Qt 接收它时,它总是被分成多个子消息。 void Seria
当我运行以下命令时,为什么我永远不会得到 readyRead/readyReadStandardOutput/readyReadStandardError 信号?我在控制台中获得了所有输出。我正在使用
我刚刚遇到了来自 QUdpSocket 的 readyRead() 信号的困难时期,虽然我找到了一个解决方案,但我仍然不确定我做了什么,但我想更准确地了解我的解决方案为什么有效。这是我的情况: 我连接
我有一个 QTcpSocket,它位于与 GUI 不同的线程中。 当通过将 readyRead() 信号连接到某个插槽来使用它时,一切正常。但是当我不使用它并遇到一个条件控制的 while(condi
根据以下帖子,只有在当前正在执行的插槽完成后,才会提供发出的信号。 Wait for a SLOT to finish the execution with Qt 我有一个基于 ssl 套接字的客户端
使用 Qt(包括带有 MinGW 的 Windows)编写跨平台应用程序。为了从 SSL 套接字读取数据,我创建了一个单独的线程。这个线程存在是出于历史原因,因为早些时候该应用程序是使用 C 套接字/
我创建了一个 hello-world 程序来帮助我理解 QTcpServer 和 QTcpSocket 的工作原理。在其中,QTcpServer 接受新连接并将它们的 readyRead() 信号连接
我在 Raspberry Pi 上使用 qextserialport 与 PanStamp(Arduino 兼容设备)通信。 这个连接到 Pi 的 PanStamp 执行两个功能: 每秒发送一些传感器
当使用QTcpSocket接收数据时,使用的信号是readyRead(),表示有新数据可用。但是,当您在相应的插槽实现中读取数据时,不会发出额外的 readyRead()。这可能是有道理的,因为您已经
我是一名优秀的程序员,十分优秀!