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

时间:2015-12-13 06:51:15

标签: c++ qt

我正在编写一个客户端服务器程序,服务器是多线程的,代码编译时没有任何错误,但它没有显示来自客户端的任何消息。  只是它运行到“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();

}

2 个答案:

答案 0 :(得分:1)

关于nextPendingConnection()

Documentation说:

  

注意:返回的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类。