[java]客户端从服务器下载文件

这篇博客分享了作者使用Java实现从服务器下载文件的过程,遇到的问题包括:byte到int转换的位运算错误、如何转换为浮点数和双精度数、以及Socket的flush操作。虽然Python和系统命令可能更方便,但作者还是详细介绍了Java实现的细节,并指出代码目前的局限性,如无图形界面、无法取消操作等。
摘要由CSDN通过智能技术生成

好长时间没用java了...  需要在两台电脑上把文件同步,用java实现了个。。。其实用python以及系统自带的命令更容易实现。。。

遇到的问题:

1. java 的byte[]  向 int long 转换,自己写的转换函数,使用 ret = ret << 8 + byte_i 时,会有问题,因为 << 的优先级比低,改成 ret = (ret<<8) + byte_i 依然有问题,因为byte_i是有符号的。。。int 与 byte 进行运算时,byte会向上扩展。。。。我的实现:

ret = (ret <<8) | (0xff & b[i]);

2.考虑如何将字节转换为float及double:  Float有一个方法 Float.intBitsToFloat( int i ),同样Double.longBitsToDouble( long i )。

3. socket的 flush 问题:如果不flush,使用write对socket的输出流发送数据之后,有可能数据一直缓冲在本机中。。。





写的较为简单,没有图形界面,且一旦开始执行没法取消,客户端也没有指定(手动或自动判断)需要同步的文件,后续加上其它功能。。。



服务器端代码:

import java.net.*;
import java.io.*;

class Util{
	public static byte [] i2b(int i){		
		byte[] b = new byte[4];
		for(int i1=0; i1<4; i1++ ){
			int v = ((i>>(8*i1)) & 0xff);
			b[3-i1]=(byte)v;
		}
		return b;
	}
	public static byte [] i2b(long i){		
		byte[] b = new byte[8];
		for(int i1=0; i1<8; i1++ ){
			b[7-i1]=(byte)((i>>(8*i1)) & 0xff);
		}
		return b;
	}	
	public static void writeInteger(OutputStream os, int val)throws IOException{
		byte [] b = i2b(val);
		// off=4时,即已经读取了4个字节,跳出.
		int off = 0;
		os.write(b, 0, b.length );
	}
	public static void writeFileInfo(OutputStream os, File f)throws IOException{
		//文件名:长度,文件内容长度.md5.
		//输出文件名,输出文件内容。		
		byte [] name = f.getName().getBytes();
		byte [] name_len = i2b(name.length);
		byte [] content_len = i2b( f.length() );
		// 文件名长度.
		os.write( name_len );
		// 文件名.
		os.write( name );
		// 文件内容长度.
		os.write( content_len );
		os.flush();
	}	
	public static bool
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值