目录
一、项目展示
TCP
二、TCP服务器的实现
1、UI界面布局
2、核心代码解析
步骤一: 创建工程, 在工程文件.pro 中添加 network,
QT += core gui network
步骤二: 服务器端编程:
1.创建 QTcpServer 对象2.创建监听端口, 使得客户端可以使用这个端口访问服务器, 使用 listen 函数。
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
第一个参数是绑定指定的地址(即本机服务器 IP) , 第二个参数是绑定的本服务器端口号。
监听某个端口时, 如果有新连接进来就发出 newConnection()信号。
3.当服务器对象被访问时, 会发出 newConnection()信号, 所以为该信号添加槽函数并用一个 QTcpSocket对象接受客户端的访问。
4.当socket接受缓冲区有新数据到来时, 会发出readyRead()信号, 为该信号添加槽函数, 使用readyRead()读取。
5.socket 发送数据可直接调用 write()成员函数。
6.关闭端口号。
3、总体代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建对象
tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);
//连接信号与槽函数绑定
connect(tcpServer,SIGNAL(newConnection()),SLOT(newConnection_Slot()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::newConnection_Slot()
{
//连接客户端后socket
tcpSocket = tcpServer->nextPendingConnection();
//套接字的接收数据信号与数据槽函数连接
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Solt()));
}
void Widget::readyRead_Solt()
{
QString buf;
//读取数据
buf = tcpSocket->readAll();
ui->jieshou->appendPlainText(buf);
}
//打开服务器
void Widget::on_open_clicked()
{
//监听
tcpServer->listen(QHostAddress::Any,ui->duankou->text().toUInt());
}
//关闭服务器
void Widget::on_close_clicked()
{
tcpSocket->close();
}
//发送数据
void Widget::on_send_clicked()
{
tcpSocket->write(ui->fasong->text().toLocal8Bit().data());
}
三、TCP客户端的实现
1、UI界面布局
2、核心代码解析
1.创建 QTcpSocket 套接字对象2.使用套接字对象的成员函数去请求连接服务器。
void connectToHost(const QHostAddress &address, quint16 port, openMode mode = ReadWrite);
2.第一个参数为服务器 IP 地址, 第二个参数为服务器端口号。 第三个参数为打开方式, 默认为可读可写
函数功能: 请求连接服务器连接成功后发出connected()信号, 绑定槽函数connected_Solt()去操作socket。
3.使用 write 函数向服务器发送数据, 当 socket 接收缓冲区有新数据到来时会发出 readyRead()信号, 为该信号添加槽函数以读取数据。
4.断开与服务器的连接。
3、总体代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建socket对象
tcpSocket = new QTcpSocket(this);
}
Widget::~Widget()
{
delete ui;
}
//打开客户端
void Widget::on_open_clicked()
{
tcpSocket->connectToHost(ui->ip->text(),ui->duankou->text().toUInt());
connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_Solt()));
}
void Widget::on_close_clicked()
{
tcpSocket->close();
}
void Widget::on_send_clicked()
{
tcpSocket->write(ui->fasong->text().toLocal8Bit().data());
}
//等待数据到来
void Widget::connected_Solt()
{
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Solt()));
}
//读取数据
void Widget::readyRead_Solt()
{
ui->jieshou->appendPlainText(tcpSocket->readAll());
}