使用Qt编写一个widget程序,监听特定的端口,将客户端发送过来的数据打印出来,并发送一个简单的http回复。
界面如下图所示:
在浏览器通过127.0.0.1:6091来访问我们的服务器端。这样,我们就能观察到浏览器发送到服务器的请求了。
qt代码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class QTextBrowser;
class QLineEdit;
class QPushButton;
class QTcpServer;
class QTcpSocket;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
public slots:
void slot_action();
void slot_clear();
void slot_connection();
void slot_read_msg(QTcpSocket* sock);
private:
QTextBrowser* _panel;
QLineEdit* _ip_edit;
QLineEdit* _port_edit;
QPushButton* _btn_action;//开启服务
QPushButton* _btn_clear;
bool _is_action;
int _limit;
QTcpServer* _tcp_server;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QTextBrowser>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent),
_is_action(false),
_tcp_server(NULL)
{
_panel = new QTextBrowser();
_port_edit = new QLineEdit();
_ip_edit = new QLineEdit();
_btn_action = new QPushButton(tr("启动"));
_btn_clear = new QPushButton(tr("清理"));
connect(_btn_action, SIGNAL(clicked()), this, SLOT(slot_action()));
connect(_btn_clear, SIGNAL(clicked()), this, SLOT(slot_clear()));
_ip_edit->setText(tr("127.0.0.1"));
_ip_edit->setReadOnly(true);
_port_edit->setText(tr("6091"));
QHBoxLayout* hLayout1 = new QHBoxLayout();
hLayout1->addWidget(_ip_edit);
hLayout1->addWidget(_port_edit);
hLayout1->addWidget(_btn_action);
hLayout1->addWidget(_btn_clear);
hLayout1->addStretch();
hLayout1->setSpacing(20);
QVBoxLayout* vMainLayout = new QVBoxLayout();
vMainLayout->addLayout(hLayout1);
vMainLayout->addWidget(_panel);
vMainLayout->setSpacing(5);
setLayout(vMainLayout);
}
void Widget::slot_action()
{
QString port = _port_edit->text();
if (!_is_action)
{
//开启http服务
_limit = 0;
_tcp_server = new QTcpServer(this);
_tcp_server->listen(QHostAddress::Any, port.toShort());
connect(_tcp_server, SIGNAL(newConnection()), this, SLOT(slot_connection()));
_btn_action->setText(tr("停止"));
_is_action = true;
}
else
{
if (_tcp_server)
{
_tcp_server->close();
}
_btn_action->setText(tr("启动"));
_is_action = false;
}
}
void Widget::slot_clear()
{
_panel->clear();
}
void Widget::slot_connection()
{
++_limit;
QTcpSocket* sock = _tcp_server->nextPendingConnection();
if (_limit <= 10000)
{
connect(sock, &QTcpSocket::readyRead, this, [this, sock](){
slot_read_msg(sock);
});
qDebug() << "new connection here...";
}
else
{
sock->close();
qDebug() << "new connection here...but discard.";
}
}
void Widget::slot_read_msg(QTcpSocket* sock)
{
QString resp_str = "HTTP/1.1 200 OK\r\nconnection: close\r\nContent-Length: ";
QString html_str = "<html><head><title>Hello World</title></head><body><h1>It's work!</h1></body></html>";
resp_str += QString::number(html_str.size());
resp_str += QString("\r\n\r\n");
resp_str += html_str;
sock->write(resp_str.toUtf8());
QString req_str = sock->readAll();
qDebug() << req_str;
_panel->append(req_str);
_panel->append(QString("\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n"));
}
Widget::~Widget()
{
}
main.cpp
#include "widget.h"
#include <QApplication>
#include <QPluginLoader>
#include <QStandardPaths>
/*
* 一个假冒的http server,只打印收到的http请求报文,同时回复一个简单的页面
*/
int main(int argc, char *argv[])
{
QCoreApplication::addLibraryPath("./");
QApplication a(argc, argv);
Widget w;
w.resize(800, 600);
w.show();
return a.exec();
}
最后,我将相关的代码上传到了csdn上,感兴趣的可以下载来玩玩:http_observer