设为首页 加入收藏

TOP

Java客户端上传图片(文件)到c++服务器(二)
2016-09-16 23:03:13 】 浏览:737
Tags:Java 客户端 上传 图片 文件 服务器
系统其他部分 public NetDataTypeTransform(){ } /** * 将int、long转为低字节在前,高字节在后的byte数组 */ public byte[] IntToByteArray(int n) { byte[] b = new byte[4]; b[0] = (byte) (n & 0xff); b[1] = (byte) (n >> 8 & 0xff); b[2] = (byte) (n >> 16 & 0xff); b[3] = (byte) (n >> 24 & 0xff); return b; } public byte[] LongToByteArray(long n) { byte[] b = new byte[8]; b[0] = (byte) (n & 0xff); b[1] = (byte) (n >> 8 & 0xff); b[2] = (byte) (n >> 16 & 0xff); b[3] = (byte) (n >> 24 & 0xff); b[4] = (byte) (n >> 32 & 0xff); b[5] = (byte) (n >> 40 & 0xff); b[6] = (byte) (n >> 48 & 0xff); b[7] = (byte) (n >> 56 & 0xff); return b; } /** * byte数组转化为int、long * 将低字节在前转为int、long,高字节在后的byte数组 */ public int ByteArrayToInt(byte[] bArr) { if(bArr.length!=4){ return -1; } return (int) ((((bArr[3] & 0xff) << 24) | ((bArr[2] & 0xff) << 16) | ((bArr[1] & 0xff) << 8) | ((bArr[0] & 0xff) << 0))); } public long ByteArrayToLong(byte[] bArr) { if(bArr.length!=8){ return -1; } return (long) ((((bArr[7] & 0xff) << 56) | ((bArr[6] & 0xff) << 48) | ((bArr[5] & 0xff) << 40) | ((bArr[4] & 0xff) << 32) | ((bArr[3] & 0xff) << 24) | ((bArr[2] & 0xff) << 16) | ((bArr[1] & 0xff) << 8) | ((bArr[0] & 0xff) << 0))); } /** * 将byte数组转化成String,为了支持中文,转化时用GBK编码方式 */ public String ByteArraytoString(byte[] valArr,int maxLen) { String result=null; int index = 0; while(index < valArr.length && index < maxLen) { if(valArr[index] == 0) { break; } index++; } byte[] temp = new byte[index]; System.arraycopy(valArr, 0, temp, 0, index); try { result= new String(temp,"GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; } /** * 将String转化为byte,为了支持中文,转化时用GBK编码方式 */ public byte[] StringToByteArray(String str){ byte[] temp = null; try { temp = str.getBytes("GBK"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return temp; } }

SendFileThread.java

package client;
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
 
public class SendFileThread extends Thread implements Runnable{
 
private Socket socket;
private NetDataCommand dataCommand;
private NetDataTypeTransform transform = new NetDataTypeTransform();
public SendFileThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
DataInputStream fromServerStream = new DataInputStream(socket.getInputStream());
DataOutputStream toServerStream = new DataOutputStream(socket.getOutputStream());
//初始化文件信息
File file = new File("F:\\Android\\4.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
int fileLen = (int)file.length();
//1.发送文件的长度
//toServerStream.write(transform.IntToByteArray(fileLen));
toServerStream.write(transform.LongToByteArray(file.length()));
toServerStream.flush();
//2.确认服务器端已经做好准备
Boolean isOk;
isOk = fromServerStream.readBoolean();
System.out.println(isOk);
byte[] toServerByte = new byte[2048];
int len;//每次发送长度
long sendLen=0;//已经发送的总长度
while((len = fileInputStream.read(toServerByte))>0){
toServerStream.write(toServerByte,0,len);
toServerStream.flush();
sendLen+=len;
System.out.println("len = "+len);
System.out.println("发送进度:"+sendLen*1.0/fileLen*1.0*100+"%");
}
//System.out.println(toServerByte.length);
sleep(10);
if (sendLen == fileLen) {
System.out.println("success");
}
System.out.println("send over!");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 
}

作为菜鸟,在写这个东西的时候遇到了很多问题,我把遇到问题的都写下来了,相信这些是很多新手都可能会遇到的问题

问题1:

在使用txt文件进行测试传输时,文件出现了乱码的情况

分析:

在c++的输出中outfile.write(buffer, ret)写文件和outfile <<写文件是有区别的,outfile.write(buffer, ret)通过形参控制可以写一个数据块,比如结构体、数组什么的;而

outfile << 只能写基本类型,如int、float、string;如果是outfile <<来写一个数据块的话,那么就会出现问题。

解决方法:

将原先使用outfile << buffer;语句写文件修改为outfile.write(buffer, ret)进行写文件。

问题2:

C++服务器接收文件完毕之后,接收到的文件大小大于java客户端发送过来的文件长度

分析:

我们不管是在c++还是java中,使用socket发送数据时,我们指定发送的长度应该是发送数据的实际长度,而不是buffer的字节数。

解决方法:

在java客户端中,修改前,我的发送文件时指定的发送长度为toServerByte.length

while((len = fileInputStream.read(toServerByte))>0){

toServerStream.write(toServerByte,0,toServerByte.length);

toServerStream.flush();

}

在java客户端中,修改后,发送文件时指定长度为len

while((len = fileInputStream.read(toServerByte))>0){

toServerStream.write(toServerByte,0,len);

toServerStream.flush();

}

问题3:

接收到的文件总莫名的多了4个byte,致使接收的图片不能正常打开。

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Effective Modern C++ 条款38 意.. 下一篇VC++入门经典学习笔记--虚函数

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目