QT下的TCP协议,服务端与客户端之间的通信
主要是写这个来记录一下,当作复习笔记。
在QT里,自己创建两个文件,一个当做客户端,一个当做服务端。
一、服务端
服务端主要有两个重要的套接字,一个是监听套接字 QTcpServer,一个是通信套接字QTcpsocket.
在写服务端时,我没用ui界面,手写按钮,文本框啥的。
①在服务端头文件里写如下代码:
#include
#include
#include
#include 类内写:
QTcpServer*_server;
QTcpSocket*_socket;
QTextEdit*_Read;
//用来显示客户端发来的信息
QTextEdit*_Write;
//你要输入的信息
QPushButton*button;
public slots:#自定义槽函数
voidslotreadyRead();
//用来读取客户端信息
voidslotNewConnection();
//当有新的客户端连接时,调用此函数
voidslotbuttonclick();
//按钮点击时调用此函数
②cpp文件内
在构造函数内
//创建服务端,并监听
_server = new QTcpServer(this);
_server->listen(QHostAddress::Any,9988);
//第一个参数是接收任何主机地址,第二个参数是端口号,自己设定。
//当有客户端连接时,便会触发newConnection信号,并且调用slotNewConnection()函数
connect(_server,SIGNAL(newConnection()),this,SLOT(slotNewConnection()));
button = new QPushButton("发送");
_Write = new QTextEdit(this);
_Read = new QTextEdit(this);
QVBoxLayout* lay = new QVBoxLayout(this);
lay->addWidget(_Read);
lay->addWidget(_Write);
lay->addWidget(button);
//当你点击发送按钮时,就会触发clicked信号,调用slotbuttonclick()函数。
connect(button,SIGNAL(clicked()),this,SLOT(slotbuttonclick()));
//当有新客户端连接时,调用此函数
void TcpServer::slotNewConnection()
{//判断是否还有未处理的连接
while(_server->hasPendingConnections())
{//调用nextPendingConnection来获取连接的socket
_socket = _server->nextPendingConnection();
//获取新连接的socket发送过来的数据connect(_socket,SIGNAL(readyRead()),this,SLOT(slotReadyread()));
}
}
//当客户端发送过来数据,调用此函数获取数据
void TcpServer::slotReadyread()
{
//把读取的数据装到字节数组里
QByteArray buf = _socket->readAll();
//把字节数组里的数据以追加的形式输出到文本框里
_Read->append(buf);
}
//当你点击按钮时,向客户端发送你输入的数据
void TcpServer::slotbuttonclick()
{
//获取编辑框内容
QString str = _Write->toPlainText();
//转码并发送
_socket->write(str.toUtf8().data());
//当发送完数据后,再把你输入的数据清空
_Write->clear();
}
以上是服务端的基本代码,接下来是客户端的代码
二、客户端
客户端内不需要监听套接字,只需要通信套接字
①头文件内
#include
#include
#include QTcpSocket* _socket;
QTextEdit* _Write;
QTextEdit* _Read;
QPushButton* button;
public slots:
void slotButtonClick();
void slotReadyread();
②cpp文件内
在构造函数里:
//创建socket,并主动连接服务端
_socket = new QTcpSocket(this);
_socket->connectToHost("127.0.0.1",9988);
//参数一:服务端IP地址,参数二:端口号,与服务端保持一致。
//当与服务端连接成功时,服务端返回信号connected,这是打印连接成功,来提醒一下。
connect(_socket,&QTcpSocket::connected,
[=]()
{
_Read->setText("连接成功");
}
);
button = new QPushButton(this);
_Read= new QTextEdit(this);
_Write = new QTextEdit(this);
QVBoxLayout* lay = new QVBoxLayout(this);
lay->addWidget(_Read);
lay->addWidget(_Write);
lay->addWidget(button);
//当服务端有数据发来,触发readyRead信号,调用slotReadyread()函数
connect(_socket,SIGNAL(readyRead()),this,SLOT(slotReadyread()));
//这个和服务端一样
connect(button,SIGNAL(clicked()),this,SLOT(slotButtonClick()));
//当有数据发来,调用此槽函数
void TcpClient::slotReadyread()
{
//获取对方发的内容
QByteArray buf = _socket->readAll();
_Read->append(buf);
}
【QT下的TCP协议,服务端与客户端之间的通信】//当你要发送数据时,调用此槽函数
void TcpClient::slotButtonClick()
{
//获取内容
QString str = _Write->toPlainText();
//发送数据
_socket->write(str.toUtf8().data());
//清理你输入的数据,当你发送完毕后。
_Write->clear();
}
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- 生活随笔|好天气下的意外之喜
- 未来可期,直面疫情下的各种困境
- Android下的IO库-Okio源码解析(一)|Android下的IO库-Okio源码解析(一) 入门
- (八)签协议
- 计算机网络基础TCP\HTTP\HTTPS
- TCP长连接与段链接
- 计算机网络|计算机网络——DHCP协议详解
- TCP组件设计篇(详细设计)
- 重压之下的我们,谁没动过几次轻生的念头