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(); }

    推荐阅读