Qt基于tcp协议网络编程
基于Qt网络编程:
基于tcp协议 c/s模式编程
所需要的类:QTcpServer QTcpSocket
利用qt基于tcp协议编写c/s模式程序:
两个类中的信号:
QTcpServer :
newConnection()
QTcpSocket:
readyRead()
connected()
disconnected()
服务器端程序步骤:QTcpServer QTcpSocket
1、.h中声明一个监听套接字和通信套接字
.cpp构造函数中:
实例化监听套接字
2、处于监听状态
3、绑定信号onNewConnection()和槽函数
槽函数:获取通信套接字
4、在onNewConnection()信号槽函数:
(1)接收套接字
(2)readyRead()和槽函数
接收数据
(3)disconnected()和槽函数
关闭通信套接字
5、收/发数据
客户端程序步骤:QTcpSocket
1、.h中声明一个通信套接字
.cpp的构造函数中 实例化套接字
2、发出链接请求
3、绑定两个信号和槽函数
connected():链接成功后发出信号
槽函数中:获取链接已经成功信息
readyRead():数据接收发出该新号
槽函数:接收数据
disconnected()和槽函数
关闭通信套接字
4、收/发送数据
案例:通过客户端给服务器发送一个字符串,服务器收到显示
服务器给客户端发送一个字符串,客户端收到后显示
增加图形界面,实现聊天功能
客户端和服务器之间通信,发送任意数据协议包
工程的参考代码:
服务器端:
widget.h文件内容:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QTcpServer *tcpSever;
QTcpSocket *tcpSocket;
public slots:
void onNewconnection();
void onReadyRead();
void onDisconnect();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
tcpSever = new QTcpServer(this);
QHostAddress ipAddr("127.0.0.1");
tcpSever->listen(ipAddr,6565);
connect(tcpSever,SIGNAL(newConnection()),this,SLOT(onNewconnection()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::onNewconnection()
{
tcpSocket = tcpSever->nextPendingConnection();
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(onDisconnect()));
qDebug()<<"new connection";
}
void Widget::onReadyRead()
{
char buf[1024] = {0};
tcpSocket->read(buf,sizeof(buf) - 1);
qDebug()<<buf;
}
void Widget::onDisconnect()
{
tcpSocket->close();
}
main.cpp文件内容:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
客户端:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QTcpSocket *socketClient;
public slots:
void onConnect();
private slots:
void on_btnSend_clicked();
void on_readyRead();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
socketClient = new QTcpSocket(this);
socketClient->connectToHost("127.0.0.1",6565);
connect(socketClient,SIGNAL(connected()),this,SLOT(onConnect()));
connect(socketClient,SIGNAL(readyRead()),this,SLOT(on_readyRead()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::onConnect()
{
qDebug()<<"connected succesfully";
}
void Widget::on_btnSend_clicked()
{
socketClient->write("hello world");
}
void Widget::on_readyRead()
{
}
main.cpp代码如下:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}