主要是写这个来记录一下,当作复习笔记。
在QT里,自己创建两个文件,一个当做客户端,一个当做服务端。
一、服务端
服务端主要有两个重要的套接字,一个是监听套接字 QTcpServer,一个是通信套接字QTcpsocket.
在写服务端时,我没用ui界面,手写按钮,文本框啥的。
①在服务端头文件里写如下代码:
#include <QTcpServer>
#include <QTcpSocket>
#include <QTextEdit>
#include <QPushButton>
类内写:
QTcpServer* _server;
QTcpSocket* _socket;
QTextEdit* _Read; //用来显示客户端发来的信息
QTextEdit* _Write; //你要输入的信息
QPushButton* button;
public slots: #自定义槽函数
void slotreadyRead(); //用来读取客户端信息
void slotNewConnection(); //当有新的客户端连接时,调用此函数
void slotbuttonclick(); //按钮点击时调用此函数
②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 <QTcpSocket>
#include <QTextEdit>
#include <QPushButton>
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);
}
//当你要发送数据时,调用此槽函数
void TcpClient::slotButtonClick()
{
//获取内容
QString str = _Write->toPlainText();
//发送数据
_socket->write(str.toUtf8().data());
//清理你输入的数据,当你发送完毕后。
_Write->clear();
}