QT下的TCP协议,服务端与客户端之间的通信

		主要是写这个来记录一下,当作复习笔记。
		在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();
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值