网络传输发送的文件内容大小不一致

问题描述

Server端:import java.net.*;import java.io.*;public class Server {// 服务器监听端口private int port;// 文件保存路径private String path;// 判断server是否启动private boolean started = false;public static void main(String[] args) {new Server(8888, "E:/").listen(8888);}// 初始化服务器端口及文件保存路径private Server(int port, String path) {this.port = port;this.path = path;}// 二进制转换为十进制public static int b2i(byte[] b) {int value = 0;for (int i = 0; i < 4; i++) {int shift = (4 - 1 - i) * 8;value += (b[i] & 0x000000FF) << shift;}return value;}public static long b2l(byte[] b) {long s = 0;long s0 = b[0] & 0xff;long s1 = b[1] & 0xff;long s2 = b[2] & 0xff;long s3 = b[3] & 0xff;long s4 = b[4] & 0xff;long s5 = b[5] & 0xff;long s6 = b[6] & 0xff;long s7 = b[7] & 0xff;s1 <<= 8;s2 <<= 16;s3 <<= 24;s4 <<= 8 * 4;s5 <<= 8 * 5;s6 <<= 8 * 6;s7 <<= 8 * 7;s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7;return s;}// 主线程始终处于监听状态,等待客户端连接private void listen(int port) {Socket s = null;ServerSocket ss = null;try {ss = new ServerSocket(port);started = true;System.out.println("监听端口:" + port);while (started) {s = ss.accept();System.out.println("A client connected!");new Thread(new HandleThread(s)).start();}} catch (IOException e) {e.printStackTrace();}}// 处理接收文件并做相关处理的线程类private class HandleThread implements Runnable {Socket s = null;private HandleThread(Socket s) {this.s = s;}public void run() {String name = getName(s);System.out.println(name);String isOver = getFile(name, s);System.out.println(isOver);}// 1、先获取文件名,并按照文件名创建相应文件壳,用于储存文件内容private String getName(Socket s) {try {InputStream is = s.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);byte[] buffer1 = new byte[4];bis.read(buffer1);int name_len = b2i(buffer1);System.out.println("s_name_len = " + name_len);// 开始获取文件名byte[] buffer2 = new byte[name_len];bis.read(buffer2);return new String(buffer2);} catch (IOException e) {return new String("接收过程出现故障!");}}// 2、开始接收文件private String getFile(String name, Socket s) {InputStream is = null;BufferedInputStream bis = null;FileOutputStream fos = null;BufferedOutputStream bos = null;File file = null;try {file = new File(path + "/" + name);if (!file.exists()) {file.createNewFile();}is = s.getInputStream();bis = new BufferedInputStream(is);fos = new FileOutputStream(file);bos = new BufferedOutputStream(fos);byte[] bytes = new byte[8];bis.read(bytes);long size = b2l(bytes);System.out.println("s_size = " + size);byte[] buffer = new byte[1024];long count = 0;while (count < size) {long num = bis.read(buffer);bos.write(buffer);count = count + num;}/*int a = -1;while ((a = bis.read()) != -1) {bos.write(a);}*/bos.flush();bos.close();return "文件 " + file.getName() + " 大小 " + file.length()+ "接收完成!";} catch (IOException e) {return "接收失败";} finally {try {if (bos != null) {bos.close();bos = null;}if (fos != null) {fos.close();fos = null;}if (bis != null) {bis.close();bis = null;}if (is != null) {is.close();is = null;}if (s != null) {s.close();s = null;}} catch (IOException e) {e.printStackTrace();}}}}}Clientimport java.net.*;import java.io.*;public class Client {// 服务器ip地址private String ipAdd;// 服务器监听端口号private int port;// 发送文件路径private String path;public static void main(String[] args) {new Client("127.0.0.1", 8888, "D:\把悲伤留给自己.mp3").connect();}public Client(String ipAdd, int port, String path) {this.ipAdd = ipAdd;this.port = port;this.path = path;}// 连接到服务器private void connect() {Socket s = null;OutputStream os = null;BufferedOutputStream bos = null;try {s = new Socket(ipAdd, port);os = s.getOutputStream();bos = new BufferedOutputStream(os);File file = new File(path);// 文件名String name = file.getName();// 文件大小long size = file.length();System.out.printf("%s%s%s%s%s", "Sending file ", name, " size ",size, " bytes to server...");// 先发送文件名到服务器boolean completed1 = sendName(name, bos);boolean completed2 = sendContent(file, bos);if (completed1 && completed2) {System.out.println("文件发送成功");} else {System.out.println("文件发送失败");}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {System.out.println("文件未检测到");} finally {try {if (bos != null) {bos.close();bos = null;}if (os != null) {os.close();os = null;}} catch (IOException e) {}}}// 整型数据转换为byte数据方法public static byte[] i2b(int i) {return new byte[] { (byte) ((i >> 24) & 0xFF),(byte) ((i >> 16) & 0xFF), (byte) ((i >> 8) & 0xFF),(byte) (i & 0xFF) };}// long类型转成byte数组public static byte[] l2b(long number) {long temp = number;byte[] b = new byte[8];for (int i = 0; i < b.length; i++) {b[i] = new Long(temp & 0xff).byteValue();temp = temp >> 8; // 向右移8位}return b;}// 发送文件名长度以及文件名到服务器private boolean sendName(String name, BufferedOutputStream bos) {byte[] buffer = name.getBytes();int name_len = buffer.length;try {// 这就要求文件名长度不能长于65535,当然,这显然不太可能!!!bos.write(i2b(name_len));bos.write(buffer);bos.flush();return true;} catch (IOException e) {return false;}}// 发送文件内容到服务器private boolean sendContent(File file, BufferedOutputStream bos) {try {long size = file.length();// 先发送文件长度bos.write(l2b(size));FileInputStream fis = new FileInputStream(file);BufferedInputStream bis = new BufferedInputStream(fis);byte[] buffer = new byte[1024];long count = 0;// 一边读入,一边写出while (count < size) {long d = bis.read(buffer);count = count + d;bos.write(buffer);}bos.flush();return true;} catch (FileNotFoundException e) {System.out.println("未检测到发送文件!");return false;} catch (IOException e) {return false;}}} 问题补充:Server端发送的文件内容和Client端接收的文件内容大小不一致,服务器端接收到的数据比客户端发送的数据大

解决方案

// 一边读入,一边写出 while (count < size) { int d = bis.read(buffer); if(d== -1) { //over break; } count = count + d; bos.write(buffer, 0, d); } 1024可能没写满write(byte[] b, int off, int len)

时间: 2024-09-17 06:18:51

网络传输发送的文件内容大小不一致的相关文章

Linux网络编程之socket文件传输示例_C 语言

本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能.该示例是基于TCP流协议实现的socket网络文件传输程序.采用C语言编写.最终能够实现传输任何格式文件的文件传输程序. 具体实现代码如下: Server端代码如下: /************************************************************************* > File Name: Server.c > Author: SongLee ***********

Python 基于Twisted框架的文件夹网络传输源码_python

由于文件夹可能有多层目录,因此需要对其进行递归遍历. 本文采取了简单的协议定制,定义了五条命令,指令Head如下: Sync:标识开始同步文件夹 End:标识结束同步 File:标识传输的文件名(相对路径) Folder:标志文件夹(相对路径) None:文件内容 每条命令以CMB_BEGIN开始,以CMB_END结束. 客户端需要对接收缓冲做解析,取出一条一条的指令,然后根据指令的Head做相应的处理,比如创建文件夹.写入文件等. 下面是服务端的代码: from twisted.interne

buffer-fwrite和fread文件内容传输的问题

问题描述 fwrite和fread文件内容传输的问题 想把一个文件内容传送到另一个文件中 #include using namespace std; int main() { FILE *pfile1 = NULL; fopen_s(&pfile1,"F:TestUploadTestUpload.txt","r"); char buffer[100]; size_t i =0; FILE * pfile2 = NULL; fopen_s(&pfile

buffer-将读取出的文件内容,分成多个部分,每个部分都是40字节发送,现在每次只发送了前40个字节的内容。

问题描述 将读取出的文件内容,分成多个部分,每个部分都是40字节发送,现在每次只发送了前40个字节的内容. 将读取出的文件内容,分成多个部分,每个部分都是40字节发送,现在无法遍历到所有的内容,每次只发送了前40个字节的内容,请帮忙看看哪里的问题,谢谢. String content = FileUtil.readFile(data);// 读取文本文件内容 // 将读取出的文件内容,分成多个部分,每个部分都是40字节发送 int number=40; byte[] buffer = new b

局域网-java socket 网络传输文件使网络使用率最大化

问题描述 java socket 网络传输文件使网络使用率最大化 局域网传输文件,如何使网络使用率最大化,主要问题是在客户端接收数据写入磁盘时会影响传输效率,有没有好的办法解决呢? 解决方案 1)文件分片并使用多线程传输,文件传输前要预先在磁盘分配好文件所需空间 2)为了提高传输效率,客户端建立数据的内存缓冲区,针对每一个文件片的传输,客户端要启一个线程负载下载到缓冲区,再启一线程从缓冲区读数据写磁盘. 解决方案二: 多线程,边传输数据边写入文件

ASP.NET通过http/https的POST方式,发送和接受XML文件内容

 本文转载:http://hi.baidu.com/ysyhyt/item/5011ae39ce3cf49fb80c0395 本文参考:http://blog.csdn.net/ououou123456789/article/details/8672962 Response.End();//这一步是关键,不输出带Html标签的内容. ASP.NET通过http/https的POST方式,发送和接受XML文件内容 发送页面: string strXML ="<root><a>

网络销售之QQ“发送离线文件”法

中介交易 SEO诊断 淘宝客 云主机 技术大厅 这个可能不是什么新方法了,大家都知道QQ有个发送文件的功能,但"发送离线文件"这个新增加的功能才是最有用的网络营销利器.这次我们就说说 怎样 使用QQ的"发送离线文件"功能来提高你的销售业绩. 做网络销售,最主要的就是通过网络,搜集目标客户的联系方式,搜集客户资料一般有下面几种常用的方法: 1.手工收集,这种方法效率低,做起来累人,但收集到的资料都是实实在在的. 2.使用软件来收集,这种方法效率高,网上也有很多免费的资

解决TCP网络传输“粘包”问题

当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport control protocol,传输控制协议)是面向连接的,提供高可靠性服务.UDP(user datagram protocol,用户数据报协议)是无连接的,提供高效率服务.在实际工程应用中,对可靠性和效率的选择取决于应用的环境和需求.一般情况下,普通数据的网络传输采用高效率的udp,重要数据的网络传输采用

WSE3.0构建Web服务安全(4) MTOM消息传输优化和文件上传、下载

MTOM消息优化传输机制主要应用于大量数据的传输,很多文章中也直接得出结论:使用MTOM文件传输效率高.为什么MTOM的数据传输效率会比别的方式要高?MTOM真的如此完美吗,它有什么不足?什么情况下使用MTOM?这些疑问,本文WSE3.0构建Web服务安全系列文章的第4节:MTOM消息优化传输机制和文件上传.下载--将为您一一解答.本节结构为1.MTOM基础概念2.WSE3.0工具配置MTOM3.代码实现与分析4.总结.最后附上实现代码供大家参考. WSE3.0中引入MTOM机制,给我们借助WS