Qt5网络tcp协议,服务器发送文件,客户端接收文件,为什么客户端接收的文件大小是0kb

客户端:
#include "client.h"
#include "ui_client.h"
#include

Client::Client(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Client)
{
ui->setupUi(this);
//初始化创建的socket对象
msocket = new QTcpSocket();

recvsize = 0;
filesize = 0;

//连接服务器
QString ip = "192.168.199.93";
msocket->connectToHost(ip,6789);  //连接固定的服务器

//接收服务器发来的数据
connect(msocket,SIGNAL(readyRead()),this,SLOT(read_data()));

//当链接服务器成功的时候会发送connected信号,并向服务器发送接收到的文件名和文件大小
//connect(msocket, SIGNAL(connected()),this, SLOT(send_filename_size()));

//成功接收一段数据会信号通知
connect(msocket,SIGNAL(bytesRead(qint64)),this, SLOT(send_file_content()));

}

Client::~Client()
{
delete ui;
}

//接收数据槽函数
void Client::read_data()
{
if(filesize == 0) //先接收文件名和文件大小
{
//创建流对象与套接字绑定
QDataStream stream(msocket);
QString name;
stream.setVersion(QDataStream::Qt_5_4);
stream>>filesize>>name;
qDebug()<<filesize<<name;

    //设置进度条最大值
    ui->progressBar->setMaximum(filesize);
    ui->progressBar->setValue(0);
    file.setFileName(name);
    int flag = file.open(QIODevice::WriteOnly);
}
else  //接收内容
{
    if(recvsize < filesize)
    {
        qDebug()<<"1";
        QByteArray array = msocket->readAll();
        file.write(array);
        recvsize += array.size();
        //设置进度条
        ui->progressBar->setValue(recvsize);
    }
    if(recvsize == filesize)
    {
        file.close();
        filesize = 0;
        recvsize = 0;
        msocket->close();
    }
}

}

服务器:

#include "server.h"
#include "ui_server.h"
#include //数据流

Server::Server(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Server)
{
ui->setupUi(this);

//初始化服务器对象
mserver = new QTcpServer();

//初始化客户端
msocket = new QTcpSocket();

//监听,需要ip地址和端口号
mserver->listen(QHostAddress::Any,6789);  //定义固定的端口号

//关联新的客户端链接信号
connect(mserver,SIGNAL(newConnection()),this,SLOT(new_client()));

}

Server::~Server()
{
delete ui;
}

void Server::new_client() //证明有客户端已经连接成功
{
qDebug()<<"新客户端链接";
msocket = mserver->nextPendingConnection();
msocket->write("hello");
}

void Server::on_pushButton_2_clicked() //浏览文件按钮
{
QString filepath = QFileDialog::getOpenFileName(this);
ui->filepathEdit->setText(filepath);
}

void Server::on_pushButton_clicked() //发送按钮
{
//先发送文件名和文件大小以及通知
//2.发送文件名, 文件大小
QString filepath = ui->filepathEdit->text();
QFileInfo info(filepath);
//a.获取文件名
QString name = info.fileName();
//b.获取文件大小
quint64 size = info.size();

qDebug()<<name<<size;  //输出文件名和文件大小

QByteArray array;
//定义个数据流绑定array
QDataStream stream(&array,QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_5_4);
//把数据通过流形式存入到array中
stream<<size<<name;

//打开文件
file.setFileName(filepath);
bool flag = file.open(QIODevice::ReadOnly);
if(!flag)
{
    qDebug()<<"open fail";
    return ;
}
//把发送字节数清空0
sendsize = 0;
//设置进度条的最大值
ui->progressBar->setMaximum(size);

//发送文件大小,文件名
msocket->write(array);//当对方收到数据后msocket会发送已经发送了多字节数据的信号

//成功发送一段数据会信号通知
connect(msocket,SIGNAL(bytesWritten(qint64)),this, SLOT(send_file_content()));

}

void Server::send_file_content()
{
//发送文件内容
if(file.isOpen()) //文件打开了,发送文件内容
{
QByteArray array = file.read(SIZE);
msocket->write(array);
sendsize += array.size();
ui->progressBar->setValue(sendsize);
qDebug()<<sendsize;
if(file.atEnd())
{
//关闭文件
file.close();
}
}

}

0

1个回答

1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
QT之TCP实现客户端接收和发送数据
利用QT实现客户端的接收和发送数据.............................................................................................
使用TCP协议实现客户端向服务器发送图片
使用TCP协议实现客户端向服务器发送图片
{网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习
{网络编程}和{多线程}应用: 基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习
python socket tcp 服务器接收文件
接收客户端发来的文件
Qt5-TCPsocket文件传送接收
Qt5实现的一个TCPsocket文件发送与接收程序
Qt利用TCP实现客户端与服务器端的数据传输
包含一个客户端和一个服务器端,实现简单的数据传输,个人感觉适于新手学习
TCP收发json. 客户端和服务端
这次是通过tcp收发json的例子。里面的程序应该用qt creator 可以直接运行。
利用TCP从客户端往服务器端发送一个文件过程中发生的问题
基础知识使用java Socket编程时java网络编程中最常用的方式,而且步骤一般都是固定的。 对客户端具体来讲,分以下几步: 1.建立客户端Socket//使用本机回环地址来测试,端口使用 10000 Socket socket = new Socket(&quot;127.0.0.1&quot;,10000); 2.从Socket中获取数据流并封装数据流//使用缓冲流加快速度 BufferedReader b
Unity网游开发3-开发TCP客户端的接收数据和发送数据
添加一个客户端的类库 //声明 客户端socket Socket clientSocket =new Socket(AddressFamily.InterNetWork,SocketType.Stream,ProtocolType.Tcp); //绑定远程IP clientSocket.Connect(new IPEndPoint (IPAddress.Parse("192.168.1.1
Qt中tcp传输文件遇到的问题
我在用tcp传文件的过程中,遇到了“掉帧”的情况,即收到的文件大小要比实际文件大小小,使得文件被破坏。我用的方法是先把文件的大小、名称等打包成文件头先传输过来,然后再传文件的本体。客户端进行接收的时候,先接受文件头,然后建立空文件,再接收后续的数据,写入空文件中。经过调试,发现,我在socket里面写了文件头以后,客户端的socket并没有马上读取文件头,而是等到了socket数据达到一定量的时候
QT5下实现基于TCP发送和接接收文件
该项目实现了利用QT5采用TCP协议,基于C/S模型接收和发送文件。
(TCP模式)客户端与服务器之间的文件传输
1 .先看需求: 上传文件 将 客户端的文件上传到 服务器 2 . 步骤: 2-1.创建socket输出流,为了方便往socket写数据: os = socket.getOutputStream(); 2-2 . 读取文件读到数组中(fileinputstream) 将数组中的数据通过os写入socket 3 . 3-1.服务器端,先接收一个
mfc socket发送和接收数据和文件
折腾了一个早上在原来的kinect程序上写一个远程发送图片功能,把截图用socket发送出去,才实现windows下两程序的对话。 主要参考了两篇博客,鞠躬感谢两位作者: http://blog.csdn.net/u010477528/article/details/41680425 http://www.cnblogs.com/wainiwann/archive/2012/05/22/
Java编写一个简单的TCP通信程序。服务器发送一条字符串,客户端接收该信息并显示。
import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;   public class SocketServer {       private static final int POR
linux socket TCP 服务器向客户端传文件(任意格式)
Server: #include&lt;netinet/in.h&gt; // sockaddr_in #include&lt;sys/types.h&gt; // socket #include&lt;sys/socket.h&gt; // socket #include&lt;stdio.h&gt; // printf #include&lt;stdlib.h&gt;...
QTcpSocket客户端和服务端发送图片(或大文件)小Demo
先看一下效果: 思路: 发图片、大文件与发短字符不大一样。 1、文件和图片通过TCP可能一次发不过去,可能要发很多次。所以我们在发送文件、数据、以及文字最好带上文件的大小。 2、图片转换成文件流的形式,这个Demo是转成base64加密流 核心代码: 1、tcp客户端与服务端的代码这里就不贴了,以前贴过,可以看我以前的帖子。这里贴一下思路代码: 发送图片端:
TCP收发json. 客户端和服务端。
好久没有写东西了。其实是因为有了自己的onedrive 和 svn 所以东西都放在自己的云里面了。 这次是通过tcp收发json的例子。 其实UDP 也是差不多的。你可以自己改改就变成了UDP了。 我直接吧代码放到下载链接里面,qt5.6.3 以上可以直接运行。 https://download.csdn.net/download/always_kay/10982653才对。 ...
QFTP的配置使用以及避免下载文件为0kb的注意事项
实际中下载到本地的时候需要注意get的参数 等待下载完成后,记得file--&amp;gt;close关闭文件。 出现下载的文件为空(0kB)的情况 这是因为QFTP是异步传输,当使用get指令下载时,需要等待文件下载结束后,在执行file--&amp;gt;close关闭下载的文件,不能在get指令后面直接就file--&amp;gt;close。 这样就会出现文件出现失败的情况。正确的做法应该是,放在个信号事...
Python使用tcp编写一个简易的文件下载器(服务端和客户端)
使用tcp编写一个简易的文件下载器 要求:需编写文件下载器服务端和文件下载器客户端 客户端: &quot;&quot;&quot; (1)创建客户端socket (2)连接服务端ip和端口 (3)send消息或recv消息 (4)关闭客户端socket &quot;&quot;&quot; import socket def main():     # 创建socket     tcp_client_socket = socket.socket(soc...
基于TCP的服务器端/客户端(二)---------网络编程(Linux----C)
基于TCP的服务器端/客户端(二)---网络编程(Linux--C) 在基于TCP的服务器端/客户端(一)中的回声客户端存在的问题: 下列是echo_client.c中的代码: write(sock,message,strlen(message)); str_len=read(sock,message,1024-1); message[str_len]=0; printf("
使用TCP协议写一个可以上传文件的服务器和客户端
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; imp
Qt实现服务器与客户端传输文字和图片(Qt②)
qt 写的socket服务器和客户端实现简单的连接 并接受和发送字符串和图片。
Qt中利用TCP实现客户端与服务器端的数据传输
最近想用Qt做一个简单的聊天室,用到了TCP传输,在此整理一下有关TCP传输的东西。(只是简单的实现数据传送,对于一些出错情况没有考虑,适于新手学习,本人也是个菜鸟) 在Qt中有QTcpsockey和QTcpserver两个类,QTcpserver主要是用来在服务器端监听客户端的连接请求,QTcpsocket用来传输数据。 服务器的建立:在.h文件中添加   QTcpSocket *
Android客户端通过TCP接收服务器端发送的数据
引言   因为我确实不懂TCP通信这一块儿,最近项目中要实现客户端接收服务器端发送过来的数据(这个数据是int型的,范围是0~360,而且服务器端用C语言写的,每一秒发送一次,客户端只需要不断接收就好了),很开心的用BufferedReader读取数据,结果发现一直读取不到数据,这下就慌了,搞了整整半天才用DataInputStream通过byte读取到数据。一、BufferedReader   ...
TCP客户端与服务器文件传输基本原理
''' 客户端'''import socket def main(): &quot;&quot;&quot;文件下载器-客户端&quot;&quot;&quot; # 创建 TCP 套接字 client_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_soc.connect(('127.0.0.1', 8081)) ...
发送和接收TCP数据包的客户端和服务器
内含工程文件,客户端和服务器端exe文件,流程图。 注意,vs2017一下版本需要手动导入代码。
TCP实现将文件从服务端传到客户端
仅当本人的学习笔记 首先是服务端的代码,一开始把文件名写死了,每次运行传输的文件都被覆盖,还以为哪里出错了,后来修改为自动创建的规律命名即可 server.cpp #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;Winsock2.h&amp;gt; #pragma comment(lib, &quot;ws2_32.lib&quot;) #include &amp;lt;iostream&amp;g...
qt写的tcp客户端程序实现简单的接受发送数据
用qt写的一个简单的tcp客户端
Java网络编程TCP协议发送接收数据
一、客户端发送,服务器端接收 package net; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /* * TCP协议接收数据: * A:创建接收端Socket对象 * B:监听客户端连接,返回一个对应的So...
C# Socket TCP 编程,客户端与服务端连接,发送字符串,文件
C# 发送消息Socket服务端和客户端, 这部分是服务端 服务端创建一个socket对象 第一个参数 :寻址方案,ip版本4 第二个参数:套接字类型,字节流  第三个参数:协议,TCP Sock
【Python】局域网内创建服务器和客户端程序并进行文件传输(TCP协议)
目录 1.什么是TCP? 1.1  TCP概念   1.2  TCP的优缺点 1.3 TCP的使用场景 1.4 TCP需要注意的点 2.客户端 3.服务端 4.运行效果 1.什么是TCP? 1.1  TCP概念   TCP:英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议.。 TC...
python使用tcp socket 传输文件-服务端,客户端
1.文件接收-服务端#_*_coding:utf-8_*_ # !/etc/bin/env python2.7 #coded by wangjd@2017 #socket file server import socket import SocketServer import struct import os #导入外部插件 #定义服务器,地址,端口 address=("",9999) #(ip,p
socket通讯,实现客户端想服务器发送指令
关于java实现socket通讯,并向服务器发送指令,返回结果可根据需要进行添加,简单入门级
服务器接受客户端发送的信息
服务器 //服务端 /** * 1 创建服务端加端口 * 2 准备接受容器 * 3 封装成包 * 4 接受数据 * @author huyao * */ public class MyServer { public static void main(String[] args) throws IOException { // 1 创建服务端加端口 Datagram
java网络编程(一)使用TCP协议完成客户端与服务端的数据传递
java网络编程(一)使用TCP协议完成客户端与服务端的数据传递
Qt编写网络调试助手(TCP客户端+TCP服务端+UDP服务端)终极版
时隔半年,对网络调试助手工具进行所有代码重写,这次目录结果整齐的一逼,代码整齐的一逼,非常完善了,打死也不再改版了。这次真的打死也不再改版了。 旧版本1:http://www.qtcn.org/bbs/read-htm-tid-55540.html 旧版本2:http://www.qtcn.org/bbs/read-htm-tid-62636.html 基本功能: 1:16进制数据和ASCII数据收发。 2:定时器自动发送。 3:自动从配置文件加载最后一次的界面设置。 4:自动从配置文件加载数据发送下拉框的数据。可以将经常使用的数据填写在send.txt中。 5:可启用设备模拟回复,当收到某个数据时,模拟设备自动回复数据。对应数据格式填写在device.txt中。 6:可对单个在线连接发送数据,也可勾选全部进行发送。 7:支持多个客户端连接并发。 8:采用单线程。 9:四种模式,tcp服务器、tcp客户端、udp服务器、udp客户端。
android应用中文件的tcp发送和接收
android应用中,通过tcp发送和接收文件,根据自己的需求修改代码可用!
局域网文件传输(Qt+服务器客户端+多线程+TCP)
本文章为Qt编程学习过程编写,仅供参考共同学习进步,请勿有其他用途!!! Qt版本为Qt Creator 5.7.0 在文章中只展示界面设计以及简单介绍,源代码可在https://github.com/CMwshuai/NetworkFileTransfer.git进行下载。 文章中对于代码部分不做解释,源代码中有详细的注释。 1、服务器端主要使用TCP和多线程进行编程。可以同时接受多个客...
【Socket网络通信】利用TCP/IP协议实现从服务端的文件中读取数据打印到客户端的控制台,服务端对客户端输入过来的数据做出响应...
四 .用TCP/IP协议写一个服务器。要求   1. 客户端一连接上,则向客户端打印三句话      第一句话:欢迎****(***是客户端的主机的名字),连接****(***服务器端主机的名字)的服务器      第二句话:您的ip为 *******      第三句话:继续操作请输入 Y,退出请输入“quit”(输入quit则服务结束)    2. 如果客户端继续操作输入的是y, 则服务器端...
使用socket编程实现服务器端与客户端(tcp)
服务器端socket。tcp创建服务器,使用的编译软件是vs//创建socketsocket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.stream,ProtocolType.Tcp);//AddressFamily.InterNetwork代表地址类型,SocketType.stream代表数据类型,Protocol...