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设计师界面类---》....
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号