首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt - QTcpserver不能正常工作

Qt - QTcpserver不能正常工作
EN

Stack Overflow用户
提问于 2011-06-25 15:00:24
回答 2查看 2K关注 0票数 2

我正在做一个简单的服务器-客户端应用程序。但是,客户端从服务器端获得了一些未定义的行为。在检索到错误代码后,我开始了解到服务器切断了连接。

这是服务器端main.cpp

代码语言:javascript
复制
#include <QApplication>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>

class MyMessageBox:public QMessageBox
{
public:
    MyMessageBox(std::string message,QWidget *parent=0):QMessageBox(QMessageBox::NoIcon,QString("ErrorMessage"),QString(message.c_str()),QMessageBox::Ok,parent,Qt::Widget)
    {
    }
};

class My_Server:public QTcpServer
{
    Q_OBJECT
public:
    My_Server();
public slots:
    void on_Connection();
};

My_Server::My_Server():QTcpServer()
{
    connect(this,SIGNAL(newConnection()),this,SLOT(on_Connection()));
}

void My_Server::on_Connection()
{
    MyMessageBox mm("Connection Established");
    mm.exec();
    QTcpSocket * my_Socket = this->nextPendingConnection();

    my_Socket->waitForBytesWritten(30000);

    QByteArray block("Hi all");

    my_Socket->write(block);
}

int main(int argc,char * argv[])
{
    QApplication app(argc,argv);

    My_Server tcp_Server;
    tcp_Server.listen(QHostAddress("127.0.0.1"),15000);

    return app.exec();
}

#include "main.moc"

这是客户端main.cpp

代码语言:javascript
复制
#include <QApplication>
#include <QDataStream>
#include <QFile>
#include <QFileDialog>
#include <QHostAddress>
#include <QMessageBox>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>

class MyMessageBox:public QMessageBox
{
public:
    MyMessageBox(std::string message,QWidget *parent=0):QMessageBox(QMessageBox::NoIcon,QString("ErrorMessage"),QString(message.c_str()),QMessageBox::Ok,parent,Qt::Widget)
    {
    }
};

int main(int argc,char * argv[])
{
    QApplication app(argc,argv);

    QTcpSocket client_Socket;

    client_Socket.connectToHost(QHostAddress("127.0.0.1"),15000);

    QDataStream in(&client_Socket);
    in.setVersion(QDataStream::Qt_4_7);

    client_Socket.waitForReadyRead(30000);

    char buf[100]={'\0'};
    client_Socket.read(buf,(quint16)sizeof(buf));
    QString nothing(buf);

    MyMessageBox mm((QString("++ ")+nothing+" ++").toStdString());
    mm.exec();

    MyMessageBox mn(QString::number(client_Socket.error()).toStdString());
    mn.exec();

    return app.exec();
}

这是pro文件(两个文件相同)

代码语言:javascript
复制
TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += main.cpp

QT += network

我不明白为什么服务器端要切断连接。如果有人能帮我找出原因,我将非常感谢他们。

注意:我在windows平台上使用的是Qt-4.7.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-25 15:28:07

连接正在关闭,因为您的服务器在发送该消息后立即退出。

这可能是因为您正在使用QApplication,但实际上并没有持久的图形用户界面小部件。因此,一旦您显示完第一个对话框,事件循环就会突然停止。

尝试以下任一操作:

在服务器端使用QCoreApplication

  • 。(并且不要启动消息框-不允许使用QCoreApplication.)
  • give服务器的图形用户界面。TCP服务器是负责启动TCP服务器的主要部件。
票数 2
EN

Stack Overflow用户

发布于 2011-06-29 06:37:27

检查QApplication的quitOnLastWindowClosed属性,这将阻止应用程序在关闭对话框后退出。

另外,在实际写入之前,您的服务器正在“等待写入字节”。你应该先写(块),然后再调用waitForBytesWritten

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6476392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档