我正在编写一个客户端服务器程序,服务器是多线程的,代码编译时没有任何错误,但它没有显示来自客户端的任何消息。 只是它运行到“qDebug()<<”客户连接“;” 这是我的代码。如果你能说出问题出在哪里,我将不胜感激。
myclient.cpp
#include "myclient.h"
#include "QTcpsocket"
#include "QTcpServer"
#include "mainwindow.h"
#include "QHostAddress"
myclient::myclient(QObject* parent): QObject(parent)
{
}
void myclient::start(QString address, quint16 port)
{
QHostAddress LocalHost;
LocalHost.setAddress(address);
m_client.connectToHost(LocalHost, 6666);
QObject::connect(&m_client, SIGNAL(connected()),this, SLOT(startTransfer()));
}
void myclient::startTransfer()
{
m_client.write("Hello", 5);
}
mythread.cpp
#include "mythread.h"
#include "myserver.h"
mythread::mythread(QTcpSocket*, QObject *parent) :
QThread(parent)
{
}
void mythread::run()
{
qDebug() << " Thread started";
if (m_client)
{
connect(m_client, SIGNAL(connected()), this, SLOT(readyRead()), Qt::DirectConnection);
}
qDebug() << " Client connected";
exec();
}
void mythread::readyRead()
{
QByteArray Data = m_client->readAll();
qDebug()<< " Data in: " << Data;
m_client->write(Data);
}
void mythread::disconnected()
{
qDebug() << " Disconnected";
m_client->deleteLater();
exit(0);
}
myserver.cpp
#include "myserver.h"
#include "mythread.h"
myserver::myserver(QObject *parent) :
QObject(parent)
{
}
void myserver::startserver()
{
connect(&m_server,SIGNAL(newConnection()), this ,SLOT(newConnection()));
int port = 6666;
if(m_server.listen(QHostAddress::Any, port))
{
qDebug() << "Listening to port " ;
}
else
{
qDebug() << "Could not start server "<<m_server.errorString();
}
}
void myserver::newConnection()
{
m_client = m_server.nextPendingConnection();
qDebug() << " Connecting...";
mythread *thread = new mythread(m_client,this);
thread->start();
}
答案 0 :(得分:1)
nextPendingConnection()
的
注意:返回的QTcpSocket对象不能在另一个对象中使用 线。如果要使用来自其他线程的传入连接, 你需要覆盖incomingConnection()。
因此,您无法在另一个线程中使用该套接字。正如文档所说,您可以继承QTcpServer
并覆盖incomingConnection()
,只要客户端尝试连接到您的服务器,就会调用此方法。
incomingConnection()
方法提供套接字描述符(就像常规文件描述符一样)。然后你可以将该套接字描述符传递给另一个线程并在那里完全创建QTcpSocket
。
在该线程中,你需要这样的东西:
QTcpSocket client = new QTcpSocket();
client.setSocketDescriptor(sockId);
// Now, you can use this socket as a connected socket.
// Make sure to connect its ready read signal to your local slot.
答案 1 :(得分:0)
进入 newConnection
后,客户端已经连接,您只需要启动一个调用readAll
然后回复的线程。
无需再次等待 connected()
信号。
QSocket
类旨在根据事件在主线程上异步工作。来自文档:
警告:QSocket不适合在线程中使用。如果需要在线程中使用套接字,请使用较低级别的QSocketDevice类。