多线程Qt服务器不回显客户端发送的数据
Multithreaded Qt server not echoing data sent by client
我有一个可以处理多线程的服务器。服务器启动并侦听,但在传入连接挂起时无法回显。
我正在使用 telnet 打开套接字并将数据发送到服务器。但是,服务器只显示它正在侦听,但不会回显我通过 telnet 键入的任何数据或表示存在传入连接。我关闭了私人网络的 Windows 防火墙,但仍然...没有。
还尝试查看服务器错误字符串是否有任何有用的信息,但它只是一个空字符串。
这对我来说完全是个谜,如果有人有任何建设性的意见,我们将不胜感激。线程和服务器的代码如下。
server.cpp
#include "myserver.h"
MyServer::MyServer(QObject *parent) :
QTcpServer(parent)
{
}
void MyServer::StartServer()
{
if(!this->listen(QHostAddress::Any,1234))
{
qDebug() << "Could not start server";
}
else
{
qDebug() << "Listening...";
}
}
void MyServer::incomingConnection(int socketDescriptor)
{
qDebug() << socketDescriptor << " Connecting...";
MyThread *thread = new MyThread(socketDescriptor,this);
connect(thread, SIGNAL(finished()),thread, SLOT(deleteLater()));
thread->start();
}
thread.cpp
#include "mythread.h"
MyThread::MyThread(int ID, QObject *parent) :
QThread(parent)
{ this->socketDescriptor = ID;
}
void MyThread::run()
{
qDebug() << socket->errorString();
//thread starts here
qDebug() << socketDescriptor << " Starting thread";
socket = new QTcpSocket();
if(!socket->setSocketDescriptor(this->socketDescriptor))
{
emit error(socket->error());
return;
}
connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection);
connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()),Qt::DirectConnection);
qDebug() << socketDescriptor << " Client Connected";
exec();
}
void MyThread::readyRead()
{
QByteArray Data = socket->readAll();
qDebug() << socketDescriptor << " Data in: " << Data;
socket->write(Data);
}
void MyThread::disconnected()
{
qDebug() << socketDescriptor << " Disconnected";
socket->deleteLater();
exit(0);
}
您使用的是哪个版本的 Qt?在 Qt 5 中,函数 incomingConnection 的参数类型为 qintptr 而不是 int。查看以下链接:
我有一个可以处理多线程的服务器。服务器启动并侦听,但在传入连接挂起时无法回显。
我正在使用 telnet 打开套接字并将数据发送到服务器。但是,服务器只显示它正在侦听,但不会回显我通过 telnet 键入的任何数据或表示存在传入连接。我关闭了私人网络的 Windows 防火墙,但仍然...没有。
还尝试查看服务器错误字符串是否有任何有用的信息,但它只是一个空字符串。
这对我来说完全是个谜,如果有人有任何建设性的意见,我们将不胜感激。线程和服务器的代码如下。
server.cpp
#include "myserver.h"
MyServer::MyServer(QObject *parent) :
QTcpServer(parent)
{
}
void MyServer::StartServer()
{
if(!this->listen(QHostAddress::Any,1234))
{
qDebug() << "Could not start server";
}
else
{
qDebug() << "Listening...";
}
}
void MyServer::incomingConnection(int socketDescriptor)
{
qDebug() << socketDescriptor << " Connecting...";
MyThread *thread = new MyThread(socketDescriptor,this);
connect(thread, SIGNAL(finished()),thread, SLOT(deleteLater()));
thread->start();
}
thread.cpp
#include "mythread.h"
MyThread::MyThread(int ID, QObject *parent) :
QThread(parent)
{ this->socketDescriptor = ID;
}
void MyThread::run()
{
qDebug() << socket->errorString();
//thread starts here
qDebug() << socketDescriptor << " Starting thread";
socket = new QTcpSocket();
if(!socket->setSocketDescriptor(this->socketDescriptor))
{
emit error(socket->error());
return;
}
connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection);
connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()),Qt::DirectConnection);
qDebug() << socketDescriptor << " Client Connected";
exec();
}
void MyThread::readyRead()
{
QByteArray Data = socket->readAll();
qDebug() << socketDescriptor << " Data in: " << Data;
socket->write(Data);
}
void MyThread::disconnected()
{
qDebug() << socketDescriptor << " Disconnected";
socket->deleteLater();
exit(0);
}
您使用的是哪个版本的 Qt?在 Qt 5 中,函数 incomingConnection 的参数类型为 qintptr 而不是 int。查看以下链接: