13、TCP通信

1、linux下的tcp通信模型

 

 

 2、qt下tcp通信模型

 

3、服务器通信模型

  1、处理连接请求、建立连接、接收消息处理

  2、需要注意:服务器端需要两个套接字:监听的和通信的

// 定义套接字成员变量  
QTcpServer *tcpserver;// 监听套接字
QTcpSocket *tcpsocket;  // 通信套接字

// 建立连接 处理接收信息
tcpserver = NULL;    // 监听套接字初始化0
    tcpsocket = NULL;    // 通信套接字初始化0
    // 设定窗口标题名称
    setWindowTitle("服务端:8888");
    // 监听套接字 指定父对象 让其自动回收内存
    tcpserver = new QTcpServer(this);
    // 绑定当前网卡所有的IP 端口号  并监听
    tcpserver->listen(QHostAddress::Any,8888);
    // 处理newConnection的信号  是否有请求连接
    connect(tcpserver,&QTcpServer::newConnection,
        [=]()
        {
          // 取出建立好的套接字 取出下一个当前最近一个
            tcpsocket = tcpserver->nextPendingConnection();
            // 获取对方的IP 端口
            QString ip = tcpsocket->peerAddress().toString();
            quint16 port = tcpsocket->peerPort();

            // 提示信息组包
            QString temp = QString("[%1:%2]: 连接成功").arg(ip).arg(port);
            ui->textEditread->setText(temp);

            // 处理接收信息  通过tcpserver获取到tcpsocket后才可以使用
            connect(tcpsocket,&QTcpSocket::readyRead,
                    [=]()
                    {
                        // 从通信套接字中取出数据
                        QByteArray array = tcpsocket->readAll();
                        // 显示栏中添加接收到的信息
                        ui->textEditread->append(QString(array));
                    }); /* 接收信息处理*/
        });/* 建立通信连接 并获取通信套接字 */

  2、发送消息处理

// 发送消息
void TcpServer::on_buttonSend_clicked()
{
    if(tcpsocket == NULL)
    {
        return;
    }
    // 获取编辑取得内容
    QString str = ui->textEditWrite->toPlainText();
    // 给客户端发送消息
    tcpsocket->write(str.toUtf8().data());
}

  3、断开连接

// 断开套接字连接
void TcpServer::on_buttonClose_clicked()
{
    if(tcpsocket == NULL)
    {
        return;
    }
    // 主动和客户端断开连接
    tcpsocket->disconnectFromHost();
    tcpsocket->close();
    tcpsocket = NULL;
}

4、客户端通信

  1、客户端套接字只需要一个

  2、处理请求连接信号

// 定义套接字成员变量
QTcpSocket *tcpsocket;

setWindowTitle("Client");
    tcpsocket = NULL;  // 套接字初始化
    tcpsocket = new QTcpSocket(this);
    // 客户端请求连接服务器 处理connected信号
    connect(tcpsocket,&QTcpSocket::connected,
            [=]()
            {
                ui->textEditRead->append("成功与服务器连接");
                QByteArray arr = tcpsocket->readAll();
                ui->textEditWrite->append(QString(arr));
            });
    // 接收消息处理 处理readyRead信号
    connect(tcpsocket,&QTcpSocket::readyRead,
            [=]()
            {
                // 收消息 处理
                QByteArray arr = tcpsocket->readAll();
                ui->textEditRead->append(QString(arr));
            });

  3、请求连接服务器

// 请求连接服务器槽函数
void ClientWidget::on_buttonConnect_clicked()
{
    // 获取IP 、端口信息
    QString ip = ui->lineEditIP->text();
    quint16 port = ui->lineEditPort->text().toInt();
    tcpsocket->connectToHost(ip,port);  // 请求连接至服务器
}

  4、处理发送按钮的槽函数

// 处理发送消息
void ClientWidget::on_buttonSend_clicked()
{
    if(tcpsocket == NULL)
    {
        return;
    }
    // 获取编辑框的内容
    QString str = ui->textEditWrite->toPlainText();
    // 将编辑框的内容写入套接字
    tcpsocket->write(str.toUtf8().data());
    ui->textEditWrite->clear();
}

  5、处理关闭按钮的槽函数

// 断开套接字连接
void ClientWidget::on_buttonClose_clicked()
{
    if(tcpsocket == NULL)
    {
        return;
    }
    // 主动与对方断开
    tcpsocket->disconnectFromHost();
    tcpsocket->close();
    tcpsocket = NULL;
}

6、新建类带有UI设计界面

Add New File-->Qt-->Qt设计师界面类---》....

 

posted @ 2020-08-07 15:30  笑不出花的旦旦  阅读(211)  评论(0)    收藏  举报