一、服务器和客户端创建流程
在pro文件中引入network
QT += core gui network
创建监听套接字对象和通信套接字对象
QTcpServer *m_s; QTcpSocket *m_tcp;
通过监听套接字对象的listen函数来监听
m_s->listen(QHostAddress::Any,port);
通过信号与槽的机制建立连接并且生成通信套接字
m_tcp = m_s->nextPendingConnection();
通过通信套接字的readall函数来读取客户端发送的数据
QByteArray data = m_tcp->readAll();
1、服务器头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_jianting_clicked();
void on_fasong_clicked();
private:
Ui::Widget *ui;
QTcpServer *m_s;
QTcpSocket *m_tcp;
};
#endif // WIDGET_H
2、服务器cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("服务器");
m_s = new QTcpServer(this);
//默认端口给到8000以上
ui->port->setText("8000");
//建立连接
connect(m_s,&QTcpServer::newConnection,this,[=](){
//连接成功后无法修改端口号
ui->port->setDisabled(true);
//创建套接字对象
m_tcp = m_s->nextPendingConnection();
ui->xianshi->append("有客户端连接");
//是否可读
connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
QByteArray data = m_tcp->readAll();
ui->xianshi->append("客户端:"+data);
});
//断开连接
connect(m_tcp,&QTcpSocket::disconnected,this,[=](){
m_tcp->close();
//如果只想连接一次后就不能使用,手动释放掉m_tcp
//m_tcp->deleteLater();
ui->xianshi->append("断开连接");
});
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_jianting_clicked()
{
int port = ui->port->text().toUShort();
//监听端口
m_s->listen(QHostAddress::Any,port);
ui->xianshi->append("开始监听");
}
void Widget::on_fasong_clicked()
{
QByteArray data = ui->shuru->toPlainText().toUtf8();
//将输入框的内容传给套接字
m_tcp->write(data);
ui->xianshi->append("服务器:"+data);
}
3、服务器ui
二、 客户端创建流程
在pro文件中引入network
QT += core gui network
和客户端不同,客户端只需要创建通信对象
QTcpSocket *m_tcp;
通过connectToHost函数进行连接
m_tcp->connectToHost(QHostAddress(ip),port);
断开时用close函数
m_tcp->close();
1、客户端头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_lianjie_clicked();
void on_duankai_clicked();
void on_fasong_clicked();
private:
Ui::Widget *ui;
QTcpSocket *m_tcp;
};
#endif // WIDGET_H
2、客户端cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("客户端");
//与客户端端口号保持一致
ui->port->setText("8000");
//ip地址如果是本地就用127.0.0.1,如果是异地就需要在cmd中输入 ipconfig查看ip
ui->ip->setText("127.0.0.1");
m_tcp = new QTcpSocket(this);
connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
QByteArray data = m_tcp->readAll();
ui->xianshi->append("服务器:"+data);
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_lianjie_clicked()
{
QString ip = ui->ip->text();
int port = ui->port->text().toUShort();
m_tcp->connectToHost(QHostAddress(ip),port);
ui->xianshi->append("连接成功");
}
void Widget::on_duankai_clicked()
{
m_tcp->close();
ui->xianshi->append("断开连接");
ui->lianjie->setDisabled(false);
}
void Widget::on_fasong_clicked()
{
QByteArray data = ui->shuru->toPlainText().toUtf8();
m_tcp->write(data);
ui->xianshi->append("客户端:"+data);
}