需求是这样的
1 client-------请求文件path----->server
2 client<-----返回文件path-------server
3 client-------请求文件(将文件path发送给server)----->server
4 client<-------返回文件(将文件以流的方式发送给client)-------server
由于系统原因:
1,2步骤采用的是系统中原来的 mina框架做的通信(),由于框架搭得很随意,现在没法维护做流传递了.........
所以 3,4步骤是我单独写的socket,
先通过原来的mina 通信获得文件路径,返回给 手机端,然后手机端通过socket请求 socketserver 发送文件
然后 手机端接收文件
现在的问题是这样的:
client ---发送文件path--->server
server---返回文件---->client
假如说这个文件大小是2M,每次我发送512KB,那么就是发送4次,代码如下:
服务端:
public void write() throws IOException {
byte[] b = new byte[524288]; //512KB
Integer temp = 0;
try {
while ((temp = this.dis.read(b)) != -1) { //dis即是文件输入流 dos是socket的输出流
this.dos.write(b, 0, temp);
this.dos.flush(); //每次都发送
}
this.dis.close();
this.dos.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(this.dos!=null){
this.dis.close();
}
if(this.dis!=null){
this.dis.close();
}
}
}
客户端:
//将要下载的文件path发送给服务器
Socket sc=new Socket(ip, 6475);
sc.setSoTimeout(500);
sc.setSoLinger(true, 3);
OutputStream os = sc.getOutputStream();
os.write(result.toString().getBytes());
os.flush();
//下载文件
InputStream is = sc.getInputStream();
MinaUtil.witerFileToSDCard(is, act);
MinaUtil.witerFileToSDCard 方法如下:
if(is==null){
return;
}
DataInputStream dis=new DataInputStream(is);
// 1.判断是否存在sdcard
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
new AlertDialog.Builder(act).setTitle("提示").setMessage("SD卡不存在,请先插入SD卡");
return;
}
String sdcardPath = Environment.getExternalStorageDirectory().toString();//获取跟目录
// 2.目录是否存在
File path=new File(sdcardPath+"/macpTemp");
if(!path.exists()){
path.mkdirs();
}
File file=new File(path+"/baogaodan.jpg");
try {
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
byte[] b=new byte[524288];
int temp=0;