系统其他部分
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,致使接收的图片不能正常打开。
分