无法从客户端向服务器发送消息

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客户端,无法向服务器发送消息

vcenter客户端无法向服务器发送完整的请求

如何从 ejabberd 服务器向多个客户端发送消息

通过Websocket从Python Flask服务器连续向客户端发送数据

从服务器向java中的多个客户端发送消息

如何在 Qt 中从服务器向连接的客户端发送消息