我知道有类似的问题已被问到,但我找不到解决问题的答案。
我正在调整一些现有的Qt代码,以便为我公司使用的程序添加服务器功能。为此,我将QTcpServer对象添加到现有对话框,调用listen()并将插槽连接到newConnection发射器,如:
.h
class QConsole : public QDialog
{
Q_OBJECT
public:
void init();
public slots:
void new_Connection();
private:
QTcpServer m_Server;
}
.cpp
void QConsole::init()
{
m_Server.listen(QHostAddress::Any, 12346);
QDialog::connect(&m_Server, SIGNAL(newConnection()), this, SLOT(new_Connection()));
}
主要是:
int main( int argc, char *argv[] )
{
QApplication app(argc, argv);
QConsole * _output_window = new QConsole(desktopRect);
_output_window->init();
_output_window->show();
return app.exec();
}
new_Connection()永远不会被调用,所以我看不到相关性,但这里是:
void QConsole::new_Connection()
{
}
这样可以正常工作,我的程序开始监听指定的端口,如果我telnet到它所做的各种连接,但永远不会调用new_Connection()!
我已经看到这个问题的帖子可以追溯到2005年,所以它显然不是一个新事物,但我没有找到的是一个令人满意的答案(或实际上任何答案)。这让每个人都在工作,甚至是那个编写了Qt服务器程序的人。我猜测现有框架存在根本性的问题,但我不知道它可能是什么。
我已经把头发撕掉了一天半,而我获得成功的关闭是使用waitForNewConnection()实际上会给我一个套接字,但当我连接到readReady()发射器时,从来没有被解雇过。那么什么会阻止这些信号永远不会被调用?
请尽量保持理智并尽可能地帮助我。
答案 0 :(得分:3)
这是一个完整的工作示例,使用MSVC ++ 2010进行测试。
这将侦听端口12346上的连接,回复“HELLO WORLD”并将连接记录到对话框中的列表中。
<强>的main.cpp 强>
#include <QtGui>
#include "console.hpp"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Console con;
con.show();
return app.exec();
}
<强> console.hpp 强>
#include <QtCore>
#include <QtGui>
#include <QtNetwork>
class Console : public QDialog
{
Q_OBJECT
public:
Console();
public slots:
void connection();
private:
QTcpServer mServer;
QListWidget* mConnList;
};
<强> console.cpp 强>
#include "console.hpp"
Console::Console() :
QDialog(),
mServer(),
mConnList(new QListWidget())
{
if (!mServer.listen(QHostAddress::Any, 12346))
qDebug() << "Error during 'listen'" << mServer.errorString();
connect(&mServer, SIGNAL(newConnection()), this, SLOT(connection()));
QVBoxLayout* mainLayout = new QVBoxLayout();
mainLayout->addWidget(mConnList);
setLayout(mainLayout);
}
void Console::connection()
{
qDebug() << "CONNECTION";
QTcpSocket* skt = mServer.nextPendingConnection();
if (!skt)
return;
mConnList->addItem(QString("%1:%2").arg(skt->peerAddress().toString()).arg(skt->peerPort()));
skt->write("HELLO WORLD!\r\n");
skt->close();
}
<强> test.pro 强>
TEMPLATE=app
CONFIG+=console debug
QT=core gui network
HEADERS=console.hpp
SOURCES=main.cpp console.cpp
答案 1 :(得分:1)
另一个工作示例,再次在Linux上,虽然我已经编写了一个程序,使用QTcpServer在Linux和Windows上运行之前没有问题。如果这不起作用,肯定它必须是Qt安装或OS配置问题。无论是Qt版本中的错误还是错误。
~/tcp_test$ qmake --version
QMake version 2.01a
Using Qt version 4.8.6 in /usr/lib/x86_64-linux-gnu
~/tcp_test$ for file in qconsole.{h,cpp} main.cpp tcp_test.pro ; do echo -e "$file:\n"; cat $file; echo; echo; done
qconsole.h:
#include <QDialog>
#include <QTcpServer>
class QConsole : public QDialog
{
Q_OBJECT
public:
QConsole();
public slots:
void connection();
private:
QTcpServer server;
};
qconsole.cpp:
#include "qconsole.h"
QConsole::QConsole()
{
server.listen(QHostAddress::Any, 12346);
QDialog::connect(&server, SIGNAL(newConnection()), this, SLOT(connection()));
}
void QConsole::connection()
{
qDebug("got connection");
}
main.cpp:
#include <QApplication>
#include "qconsole.h"
int main( int argc, char *argv[] )
{
QApplication app(argc, argv);
QConsole * window = new QConsole();
window->show();
return app.exec();
}
tcp_test.pro:
QT = core gui network
CONFIG += debug
TARGET = tcp_test
SOURCES = main.cpp qconsole.cpp
HEADERS = qconsole.h
~/tcp_test$ ./tcp_test &
[3] 9784
~/tcp_test$ nc localhost 12346
got connection
^C