<Qt>实例:TCP网络传输
来源:互联网 发布:全景补地软件 编辑:程序博客网 时间:2024/05/17 23:09
一、概览
分为服务端和客户端端:
二、服务端
1、UI界面
2、头文件
#ifndef TCPSERVER_H#define TCPSERVER_H#include <QWidget>#include <QTcpServer>#include <QTcpSocket>#include <QList>namespace Ui {class TcpServer;}class TcpServer : public QWidget{ Q_OBJECTpublic: explicit TcpServer(QWidget *parent = 0); ~TcpServer();private slots: void on_startBt_clicked(); void new_client(); void on_sendBt_clicked(); void read_data(); void client_dis();private: Ui::TcpServer *ui; QTcpServer* mserver; QTcpSocket* msocket; QList<QTcpSocket *> sockets;};#endif // TCPSERVER_H3、main.cpp
#include "tcpserver.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); TcpServer w; w.show(); return a.exec();}4、Tcpserver.cpp
#include "tcpserver.h"#include "ui_tcpserver.h"#include <QMessageBox>#include <QDebug>TcpServer::TcpServer(QWidget *parent) : QWidget(parent), ui(new Ui::TcpServer){ ui->setupUi(this); //初始化QTcpServer对象 mserver = new QTcpServer(); //关联客户端链接信号 connect(mserver,SIGNAL(newConnection()),this, SLOT(new_client())); ui->sendBt->setEnabled(false);}TcpServer::~TcpServer(){ delete ui;}/*开启服务器*/void TcpServer::on_startBt_clicked(){ //检测是否已经监听 if(mserver->isListening()) { //如果监听就关闭 mserver->close(); ui->startBt->setText("开启"); ui->portEdit->setEnabled(true); return ; } if(ui->portEdit->text().isEmpty()) { //提示输入端口号 QMessageBox::warning(this, "提示","请输入端口号"); return ; } bool flag = mserver->listen(QHostAddress::Any,ui->portEdit->text().toShort()); if(flag) { //监听成功 ui->startBt->setText("关闭"); ui->portEdit->setEnabled(false); }}/*客户端链接,触发槽函数, 接受链接,得到与客户端通信的套接字(QTcpSocket)*/void TcpServer::new_client(){ qDebug()<<"新客户端链接"; msocket = mserver->nextPendingConnection(); //给客户端发送数据 msocket->write("hello"); //关联读数据信号 connect(msocket,SIGNAL(readyRead()),this, SLOT(read_data())); //客户端掉线会发送disconnected信号 connect(msocket,SIGNAL(disconnected()),this,SLOT(client_dis())); //获取客户端IP地址 QString ip = msocket->peerAddress().toString(); ui->listWidget->addItem(ip); //把客户端套接字添加到列表sockets中 sockets.append(msocket); //启用发送按钮 ui->sendBt->setEnabled(true); ui->listWidget->setCurrentRow(0);}/*发送数据*/void TcpServer::on_sendBt_clicked(){ //获取选择的客户端 int row = ui->listWidget->currentRow(); QString msg = ui->sendEdit->toPlainText(); sockets.at(row)->write(msg.toLatin1());}/*读取数据*/void TcpServer::read_data(){ //信号发送者--掉线客户端套接字 QTcpSocket *sock = (QTcpSocket*)sender(); QString msg = sock->readAll(); QString ip = sock->peerAddress().toString(); ui->recvList->addItem(ip+":\n\t"+msg);}/*当客户端掉线的时候会调用此函数*/void TcpServer::client_dis(){ //信号发送者--掉线客户端套接字 QTcpSocket *sock = (QTcpSocket*)sender(); //从sockets列表中找到套接字所在的位置 int row = sockets.indexOf(sock); //根据行从ip列表中删除Ip QListWidgetItem *item = ui->listWidget->takeItem(row); delete item; //把掉线套接字从列表sockets中删除 sockets.removeOne(sock); if(ui->listWidget->count() == 0) ui->sendBt->setEnabled(false);}
三、客户端
1、UI界面
2、头文件
#ifndef TCPCLIENT_H#define TCPCLIENT_H#include <QWidget>#include <QTcpSocket>namespace Ui {class TcpClient;}class TcpClient : public QWidget{ Q_OBJECTpublic: explicit TcpClient(QWidget *parent = 0); ~TcpClient();private slots: void on_connectBt_clicked(); void on_sendBt_clicked(); void read_data(); void on_clearBt_clicked(); void connect_to_server(); void disconnect_from_server();private: Ui::TcpClient *ui; QTcpSocket *msocket;};#endif // TCPCLIENT_H3、main.cpp
#include "tcpclient.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); TcpClient w; w.show(); return a.exec();}4、Tcpclient.cpp
#include "tcpclient.h"#include "ui_tcpclient.h"TcpClient::TcpClient(QWidget *parent) : QWidget(parent), ui(new Ui::TcpClient){ ui->setupUi(this); //初始化QTcpSocket对象 msocket = new QTcpSocket(); //关联接收数据信号 connect(msocket,SIGNAL(readyRead()),this, SLOT(read_data())); //如果链接成功会发送connected信号 connect(msocket,SIGNAL(connected()),this, SLOT(connect_to_server())); //如果掉线会发送disconnected信号 connect(msocket,SIGNAL(disconnected()),this,SLOT(disconnect_from_server())); //发送按钮禁用 ui->sendBt->setEnabled(false);}TcpClient::~TcpClient(){ delete ui;}/*链接服务器*/void TcpClient::on_connectBt_clicked(){ if(ui->connectBt->text() == "关闭") { msocket->disconnectFromHost(); return ; } QString ip = ui->ipEdit->text(); int port = ui->portEdit->text().toInt(); //链接服务器 msocket->connectToHost(ip, port);//如果链接成功会发送connected信号}void TcpClient::on_sendBt_clicked(){ //获取输入的内容 QString msg = ui->textEdit->toPlainText(); msocket->write(msg.toLatin1()); ui->textEdit->clear();}/*读取数据*/void TcpClient::read_data(){ QString msg=msocket->readAll(); ui->listWidget->addItem(msg);}void TcpClient::on_clearBt_clicked(){ ui->textEdit->clear();}/*链接服务器成功*/void TcpClient::connect_to_server(){ //禁用ip,port修改 ui->ipEdit->setEnabled(false); ui->portEdit->setEnabled(false); ui->connectBt->setText("关闭"); //启用发送按钮 ui->sendBt->setEnabled(true);}/*断开服务器*/void TcpClient::disconnect_from_server(){ ui->ipEdit->setEnabled(true); ui->portEdit->setEnabled(true); ui->connectBt->setText("链接"); ui->sendBt->setEnabled(false);}
四、运行测试:
阅读全文
0 0
- <Qt>实例:TCP网络传输
- Qt TCP协议 传输简单字符串实例
- Qt TCP协议 传输简单字符串实例
- QT+Opencv视频文件TCP网络传输
- 【转】Qt TCP协议 传输简单字符串实例
- Qt Tcp传输
- qt TCP传输字符串
- 基于TCP、UDP网络传输的实例分析
- 基于TCP、UDP网络传输的实例分析
- 网络传输tcp传输2
- 网络编程--tcp传输
- 网络传输TCP
- QT 网络传输中文
- tcp网络传输服务器 listener
- TCP网络传输客户端client
- Java-网络编程(TCP传输)
- windows下tcp网络传输
- qt ,使用tcp/ip协议网络传输数据时,字节序转换方法
- tomcat配置多个数据源
- 队内训练赛--A(Tree)
- Vuejs的一些总结
- 实验三:内部模块化的命令行菜单小程序V2.0
- 关于微信公众号scope参数错误或没有scope权限的解决方案
- <Qt>实例:TCP网络传输
- Ubuntu 14.04 LTS 安装MyEclipse2016
- pdf转CAD就用迅捷CAD转换器
- 条件语句
- 系统服务的控制
- 可设RadioButton图片的大小
- 说明:最新"谷歌AI智商不超过6岁"研究来自科学院而非康内尔大学
- Boolan 设计模式 第二周
- 安装Gitlab