贵州网站建设公司,wordpress友情首页,济南网站搭建公司,短视频获客系统传输文件和传输信息的区别#xff1a; 传输信息#xff0c;只是一条数据#xff0c;传输文件是多条数据传输信息传输过去一般都会显示#xff0c;传输文件一般不会显示#xff0c;一般只是存放在文件中传输文件需要传输#xff0c;文件大小和文件名称#xff08;不然不知…传输文件和传输信息的区别 传输信息只是一条数据传输文件是多条数据传输信息传输过去一般都会显示传输文件一般不会显示一般只是存放在文件中传输文件需要传输文件大小和文件名称不然不知道什么时候结束在这里使用的是服务器端发送数据客户端接收数据。
为了在本地测试把服务器端和客户端分项目编写方便在一台电脑上测试。
总的代码会在文件最后给出
目录显示 File_Tcp为服务器端发送文件File_Tcp_Socket 为客户端接收文件创建的时候忘记该类名了这里就使用widget了服务器端的编写 发送的规则 先发送文件的参数文件大小和文件名然后再发送文件的内容创建一个项目
pro文件中添加
QT network
ui界面添加以下控件 tcp_server.h文件内容解析
1.添加以下头文件
#includeQTcpServer
#includeQMessageBox
#includeQFile
#includeQMessageBox
#includeQTcpSocket
#includeQHostAddress
#includeQNetworkInterface
#includeQFileDialog
#includeQDataStream
#includeQFileInfo
2.添加私有成员
privateQTcpServer *server;//服务器端QTcpSocket *socket;//套接字QString FilePathName;//文件路径QString FileName;//文件名QFile * LocalFile;//文件指针打开需要传输的文件qint64 FileSize0;//文件总大小qint64 TFSize0;//已传输的大小qint64 ToBeSize0;//未传输的数据qint64 payloadSize64*1024;//有效的载荷64KBQByteArray block;//缓存用来临时存储需要发送的信息
3.槽函数
private slots:void on_pushButton_3_clicked();void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_4_clicked();//上面是ui界面转到槽生成的信号void Send_File(qint64 num);//用来传输文件内容
4.事件和其他函数
protected:void closeEvent(QCloseEvent *event);//重写关闭事件QString getIp();//获取IP tcp_server.cpp文件内容解析
1.构造函数中的内容 servernew QTcpServer(this);//QTcpServer的初始化QString IpgetIp();//获取本机的IP地址ui-lineEdit_4-setText(tr(%1).arg(Ip));//再主机的lineEdit中显示IP地址ui-lineEdit_5-setText(6666);//设置端口号socketnullptr;//初始化QTcpSocketconnect(server,QTcpServer::newConnection,[]()//当有新的连接时{QMessageBox::information(this,提示信息,已有新连接,QMessageBox::Ok);socketnew QTcpSocket(this);//套接字socketserver-nextPendingConnection();//获取套接字});//实现可以多次传输当文件地址改变时这些参数都置为0connect(ui-lineEdit,QLineEdit::textChanged,[]()//{FileSize0;//文件总大小TFSize0;//已传输的大小ToBeSize0;//未传输的数据ui-lineEdit_2-setText();ui-lineEdit_3-setText();});2.getIP函数的实现
QString TCP_Server::getIp()//获取IP
{QListQHostAddress addssQNetworkInterface::allAddresses();//获取全部地址foreach(QHostAddress add,addss)//遍历这些地址{if(add.protocol()QAbstractSocket::IPv4Protocol)//如果地址为IVP4的话{return add.toString();//返回该地址}}return 0;//没有的话返回0
}
3.监听的实现
void TCP_Server::on_pushButton_3_clicked()//监听
{if(!server-listen(QHostAddress(ui-lineEdit_4-text()),ui-lineEdit_5-text().toInt()));//如果监听失败{return;}
}
4.获取文件名的实现
void TCP_Server::on_pushButton_clicked()//获取文件名
{FilePathNameQFileDialog::getOpenFileName(this);//获取路径if(!FilePathName.isEmpty())//文件名不为空{QFileInfo fi(FilePathName);//创建一个文件信息对象FileNamefi.fileName();//获取文件名ui-lineEdit-setText(FilePathName);//放置文件名}}
5.取消的实现
void TCP_Server::on_pushButton_4_clicked()//取消
{if(server-isListening())//如果正在监听{server-close();if(LocalFile-isOpen()){LocalFile-close();}socket-abort();//断开连接}
}
6.重写关闭事件
void TCP_Server::closeEvent(QCloseEvent *event)//重写关闭事件
{on_pushButton_4_clicked();//取消close();
}
7.发送的实现发送文件的一些参数
void TCP_Server::on_pushButton_2_clicked()//发送文件信息
{LocalFilenew QFile(FilePathName);//打开该文件if(!LocalFile-open(QFile::ReadOnly))//当文件打不开{QMessageBox::information(this,提示信息,发送失败,QMessageBox::Ok);return;}//当接收完一次数据后,执行传输文件的操作直到传输完connect(socket,SIGNAL(bytesWritten(qint64)),this,SLOT(Send_File(qint64)));//使用缓存FileSizeLocalFile-size();//获取文件的大小QDataStream Ds(block,QIODevice::WriteOnly);//创建一个数据流Ds.setVersion(QDataStream::Qt_5_9);//设置版本号;Dsqint64(0)qint64(0)FileName;//将数据写入流中FileSizeblock.size();//获取流中数据的大小Ds.device()-seek(0);//回到开头DsFileSizeqint64(block.size()-sizeof(qint64)*2);//数据的总长度和文件长度//把文件头传输出去同时修改待发送的字节数ToBeSizeFileSize-socket-write(block);block.resize(0);//把缓存置0以便下次使用}
这里主要解释一下
//当接收完一次数据后,执行传输文件的操作直到传输完connect(socket,SIGNAL(bytesWritten(qint64)),this,SLOT(Send_File(qint64))); 在这里使用新版的信号于槽会报错不知道什么原因。 bytesWrittenqint64每次将数据有效负载写入设备的当前写入通道时都会发出此信号。会返回写入的字节数。 当写入通道时使用Send_File(qint64)来统计字节数 8.Send_File(qint64)的实现 首先要统计数据判断数据如果还有未传输的数据继续传输在显示总的文件大小和已传输的大小如果已发送的文件大小总文件大小关闭文件关闭服务器提示传输完成void TCP_Server::Send_File(qint64 num)//传输文件数据
{qApp-processEvents();//防止传输文件时页面冻结TFSize(int)num;//更新已传输的数据大小if(ToBeSize0)//如果未传输的数据大于0{//当剩下的数据小于payloadSize时优先使用更小的值blockLocalFile-read(qMin(ToBeSize,payloadSize));//读取数据ToBeSize-(int)socket-write(block,block.size());//发送并更新数据大小block.resize(0);//清空缓存}else{LocalFile-close();}ui-lineEdit_3-setText(tr(%1).arg(FileSize/(1024*1024))MB);//总的数据量ui-lineEdit_2-setText(tr(%1).arg(TFSize/(1024*1024))MB);//已传输的数据if(FileSizeTFSize){LocalFile-close();//关闭文件server-close();//关闭服务器QMessageBox::information(this,提示信息,传输完成,QMessageBox::Ok);}}
main函数
#include tcp_server.h
#include QApplicationint main(int argc, char *argv[])
{QApplication a(argc, argv);TCP_Server w;w.show();return a.exec();
}服务器端的搭建 接收文件时需要判断是否接受了文件信息 接受了话再接受文件的内容创建一个项目
pro文件中添加
QT network
ui界面中添加以下控件 widget.h文件的内容解析
1.添加以下头文件
#includeQTcpSocket
#includeQDataStream
#includeQMessageBox
#includeQHostAddress
#includeQFile
2.添加私有成员 QTcpSocket *socket;//套接字QFile *file;//文件指针qint64 RCDsize;//接收的数据qint64 ToBoSize;//未接收的数据qint64 Filesize;//文件总大小qint64 Allsize;//总大小QString FileName;//文件名称QByteArray inblock;//缓存
3.槽函数
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();
//以上未ui界面中转到槽实现void readData();//读取数据
4.重写事件
protected:void closeEvent(QCloseEvent *event);//重写关闭事件 widget.cpp文件的内容解析
1.构造函数 socketnew QTcpSocket(this);ui-lineEdit_2-setText(6666);//设置端口号未6666ToBoSize0;Filesize0;RCDsize0;connect(socket,QTcpSocket::readyRead,this,Widget::readData);//读取数据
2.连接的实现
void Widget::on_pushButton_clicked()//连接
{
socket-abort();//断开已有连接//创建连接socket-connectToHost(QHostAddress(ui-lineEdit-text()),ui-lineEdit_2-text().toInt());
}//QHostAddress(ui-lineEdit-text())为地址
//ui-lineEdit_2-text().toInt()为端口号
3.取消的实现
void Widget::on_pushButton_2_clicked()//取消
{socket-abort();//断开连接if(file-isOpen()){file-close();}}
4.重写关闭事件
void Widget::closeEvent(QCloseEvent *event)
{socket-abort();if (file-isOpen())file-close();close();
}
5.读取数据的实现
void Widget::readData()//读取数据
{QDataStream in(socket);//流读取数据in.setVersion(QDataStream::Qt_5_9);if(RCDsizesizeof(qint64)*2){if((socket-bytesAvailable()sizeof(qint64)*2)(Filesize0)){inAllsizeFilesize;//读取资源的大小文件的大小RCDsizesizeof(qint64)*2;//更新读取的数据}if((socket-bytesAvailable()Filesize)(Filesize!0)){inFileName;//读取文件名称filenew QFile(FileName);//打开文件ui-lineEdit_3-setText(QString(%1).arg(FileName));RCDsizeFilesize;//更新读取的数据if(!file-open(QFile::WriteOnly)){QMessageBox::information(this,提示信息,无法读取文件);return;}}else{return;}}if(RCDsizeAllsize)//如果接受的数据小于总数据继续接受{RCDsizesocket-bytesAvailable();inblocksocket-readAll();file-write(inblock);inblock.resize(0);}//更新显示的数据ui-lineEdit_4-setText(QString(%1).arg(RCDsize/(1024*1024))MB);ui-lineEdit_5-setText(QString(%1).arg(Allsize/(1024*1024))MB);if(RCDsizeAllsize)//如果接受的数据等于总数据传输完成{file-close();socket-close();QMessageBox::information(this,提示信息,接收完成,QMessageBox::Ok);//将数据清空以便下次使用filenullptr;//文件指针RCDsize0;//接收的数据ToBoSize0;//未接收的数据Filesize0;//文件总大小Allsize0;//总大小FileName;//文件名称inblock0;//缓存}
}
运行结果 先运行服务器端再运行客户端客户端和服务器端都输入IP和端口号服务器端选择文件点击发送1.输入主机和端口号 2.点击连接然后点击监听 3.选择文件点击发送
数据太小所以0MB 注意传输完会断开连接所以还需要点击连接再点击监听 源码已发出
QtTcp传输文件简易-C文档类资源-CSDN文库