当前位置: 代码迷 >> Android >> android socket通信 client端等不到server端恢复就结束了
  详细解决方案

android socket通信 client端等不到server端恢复就结束了

热度:103   发布时间:2016-04-28 05:17:07.0
android socket通信 client端等不到server端回复就结束了
需求是这样的 
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;
  相关解决方案