无法从客户端向服务器发送消息
Posted
技术标签:
【中文标题】无法从客户端向服务器发送消息【英文标题】:unable to send message from client to server 【发布时间】:2015-12-13 06:51:15 【问题描述】:我正在编写一个服务器是多线程的客户端服务器程序,代码编译没有任何错误,但它没有显示来自客户端的任何消息。 只是它运行到“qDebug()
我的客户端.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);
我的服务器.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();
【问题讨论】:
请edit您的问题并添加您服务器的代码。 【参考方案1】:Documentation 关于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.
【讨论】:
【参考方案2】:一旦你进入newConnection
,客户端已经连接,你只需要启动一个线程调用readAll
然后回复。
无需再次等待connected()
信号。
编辑
QSocket
类旨在根据事件在主线程上异步工作。来自文档:
警告:QSocket 不适合在线程中使用。如果您需要在线程中使用套接字,请使用较低级别的 QSocketDevice 类。
【讨论】:
我忽略了 connected() 但它仍然不起作用!运行服务器时出现以下错误:程序意外完成。 哦,你是对的,我们不能在后台线程中使用那个套接字。它会抛出异常。 @Hanita:对不起。我的回复基于一般套接字编程技术。QSocket
是一个更高级别的对象,具有完全不同的方法...您应该参考文档以获取示例客户端/服务器解决方案(例如 doc.qt.io/qt-5/qtnetwork-fortuneserver-example.html)以上是关于无法从客户端向服务器发送消息的主要内容,如果未能解决你的问题,请参考以下文章
Java Server,html客户端,无法向服务器发送消息