网络对讲机C#服务器 Android客户端(三) android客户端代码分析
2013-04-29 12:24
483 查看
完整的工程下载地址(源码):http://download.csdn.net/detail/zhujinghao09/5313666
完整的工程下载地址(源码):http://download.csdn.net/detail/zhujinghao09/5313666
因为这个版本只是功能实现的测试版,所以界面做的很丑,请大家见谅,主要看功能哦!!
主要功能:
连接服务器,并开启一个监听来信的线程,如果有来信,开启接收文件线程;
按钮控制发送语音线程;
使用第三方类实现原生未压缩的录音格式 .wav;
使用android 系统自带的mediaPlayer 实现声音播放功能;
第一步: 连接服务器
btnConnect.setOnClickListener(newButton.OnClickListener()
{
@Override
publicvoid onClick(View arg0) {
//TODO Auto-generated method stub
//IP=etIp.getContext().toString();
IP= etIp.getText().toString();
try{
Port= Integer.parseInt(etPort.getText().toString());
}catch(Exceptione)
{
Log.i(Tag,"IP"+IP+"port"+Port);
Toast.makeText(MainActivity.this,"请输入正确的端口号!!",Toast.LENGTH_LONG).show();
return;
}
try{
client= new Socket(IP, Port); //连接服务器
}catch (UnknownHostException e) {
//TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this,"UnknownHostException", Toast.LENGTH_LONG).show();
return;
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this,"IOException!",Toast.LENGTH_LONG).show();
return;
}
PrintWriterout;
try{
out= new PrintWriter(client.getOutputStream(), true);
out.println("Android"); //向服务器发送客户端名称
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
tvState.setText("连接服务器成功!!!");
SocketListensListen = new SocketListen(client,mHandler); //开启监听接收线程
sListen.SetControlBar(tvRecvCount);
sListen.start();
}
});
第二步:监听接收线程
发送文件线程类:
完整的工程下载地址(源码):http://download.csdn.net/detail/zhujinghao09/5313666
完整的工程下载地址(源码):http://download.csdn.net/detail/zhujinghao09/5313666
因为这个版本只是功能实现的测试版,所以界面做的很丑,请大家见谅,主要看功能哦!!
主要功能:
连接服务器,并开启一个监听来信的线程,如果有来信,开启接收文件线程;
按钮控制发送语音线程;
使用第三方类实现原生未压缩的录音格式 .wav;
使用android 系统自带的mediaPlayer 实现声音播放功能;
第一步: 连接服务器
btnConnect.setOnClickListener(newButton.OnClickListener()
{
@Override
publicvoid onClick(View arg0) {
//TODO Auto-generated method stub
//IP=etIp.getContext().toString();
IP= etIp.getText().toString();
try{
Port= Integer.parseInt(etPort.getText().toString());
}catch(Exceptione)
{
Log.i(Tag,"IP"+IP+"port"+Port);
Toast.makeText(MainActivity.this,"请输入正确的端口号!!",Toast.LENGTH_LONG).show();
return;
}
try{
client= new Socket(IP, Port); //连接服务器
}catch (UnknownHostException e) {
//TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this,"UnknownHostException", Toast.LENGTH_LONG).show();
return;
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this,"IOException!",Toast.LENGTH_LONG).show();
return;
}
PrintWriterout;
try{
out= new PrintWriter(client.getOutputStream(), true);
out.println("Android"); //向服务器发送客户端名称
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
tvState.setText("连接服务器成功!!!");
SocketListensListen = new SocketListen(client,mHandler); //开启监听接收线程
sListen.SetControlBar(tvRecvCount);
sListen.start();
}
});
第二步:监听接收线程
package er.fly; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import er.fly.nettandclient.MyHandler; import android.util.Log; import android.widget.TextView; public class SocketListen extends Thread{ private Socket client; //private String savepath="/sdcard/MyVoice/"; MyHandler mHandler; MyHandler SLHandler; TextView tvR; public SocketListen(Socket s,MyHandler h) { this.client=s; mHandler = h; } public void SetControlBar(TextView tv) { tvR = tv; } public void run() { int len; if (client == null) return; while(true) //循环监听来信 { BufferedReader in;// = new BufferedReader(new InputStreamReader(System.in)); // 接收来自 server 的响应数据 try { in = new BufferedReader(new InputStreamReader(client .getInputStream())); try { String strlen= in.readLine(); //读取网络流,文件长度 //System.out.println("File Size :"+strlen); Log.i("SocketListen", strlen); len = Integer.parseInt(strlen); //开启接收文件线程 DownloadFile downFile = new DownloadFile(client,len); downFile.SetHanglers(mHandler, SLHandler); downFile.SetControlBar(tvR); downFile.start(); //this.suspend(); while(true) //判断文件是否接收完成//等待 { if(!downFile.isAlive()) break; } }catch(IOException e) { Log.i("SocketListen", "no recv"); } } catch (IOException e) { // TODO Auto-generated catch block //e.printStackTrace(); } } } }接收文件线程类:
package er.fly; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Date; import er.fly.nettandclient.MyHandler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.widget.TextView; //import er.fly.nettandclient; public class DownloadFile extends Thread{ private Socket client; File file=null; String sendinfo=null; int fileLen; String tag = "DownloadFile"; MyHandler mHandler; //用于子线程和主线程通信,更新声音列表 MyHandler SLHandler; TextView tvRecvCount; String recvVoiceSavePath; public DownloadFile(Socket s,int l) { this.client = s; fileLen=l; } public void SetHanglers(MyHandler m,MyHandler sl) { mHandler = m; SLHandler = sl; } public void SetControlBar(TextView tv) { tvRecvCount = tv; } // 创建目录(不存在则创建) public File CreateDir(String dir) { File file = new File(dir); if (!file.exists()) { file.mkdirs(); } return file; } public void run() { Looper curLooper = Looper.myLooper(); Looper mainLooper = Looper.getMainLooper(); String msg=null; boolean flag = false; if(client == null) { return ; } try { InputStream inputStream = client.getInputStream(); byte[] buffer = new byte[1024]; int readCount = 0; int count=0; CreateDir("sdcard/MyRecvVoice/"); int h = new Date().getHours(); int m = new Date().getMinutes(); int s = new Date().getSeconds(); String strTime = String.valueOf(h)+"-"+String.valueOf(m)+"-"+String.valueOf(s); BufferedOutputStream fo = new BufferedOutputStream(new FileOutputStream(new File("sdcard/MyRecvVoice/"+strTime+".wav"))); //循环接收文件 while (true) { readCount = inputStream.read(buffer); count = count+readCount; fo.write(buffer, 0,readCount); //System.out.println("recv len " + String.valueOf(count)+"readCount "+String.valueOf(readCount)); Log.i(tag, "recv len"+ String.valueOf(count)+"readCount "+String.valueOf(readCount)); if(count>=fileLen) //判断接收结束 break; } flag = true; recvVoiceSavePath="sdcard/MyRecvVoice/"+strTime+".wav"; Log.i(tag,"接收成功!!"); fo.flush(); fo.close(); //inputStream.close();// 一定不能关闭输入输出流,因为关闭它们的同时也会关闭socket //这个很重要 //outputStream.close(); } catch(IOException e) { e.printStackTrace(); } mHandler = new MyHandler(mainLooper); mHandler.SetHandlerArgs(tvRecvCount); if(flag) msg="DownloadFile:"+recvVoiceSavePath+"#"+"接收成功!!"; else msg="DownloadFile:"+"$"+"接收失败!!"; mHandler .removeMessages(0); Message m = mHandler .obtainMessage(1, 1, 1, msg);//向主线程发信,通知接收结束 mHandler .sendMessage(m); } }
发送文件线程类:
package er.fly; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketException; import android.util.Log; public class UpFile extends Thread{ private Socket client; File file=null; String Tag ="UpFile"; public UpFile(Socket client) { this.client = client; } public void SetFile(File file){ this.file = file; } public void run(){ if(client == null) { return ; } if(client.isOutputShutdown()) { try { client.setKeepAlive(true); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.i(Tag, "client setKeepAlive worry"); } } FileInputStream reader = null; FileInputStream readLen = null; byte[] buf = null; try{ InputStream inPut = client.getInputStream(); OutputStream outPut = client.getOutputStream(); readLen = new FileInputStream(file); ByteArrayOutputStream ow = new ByteArrayOutputStream(); int count =0; int buffersize= 256; int fileLen=0; buf = new byte[buffersize]; while ((count = readLen.read(buf)) > 0) //读取文件字节长度 { fileLen = fileLen + count; } String strLen =String.valueOf(fileLen); strLen = strLen+"\n"; Log.i(Tag, strLen); byte[] buffLen = strLen.getBytes(); byte[] buffL = new byte[50]; for(int i=0;i<50;i++) //把文件字节长度添加到一个长度为50字节数组中 //因为服务也是一次接收50个字节 { if(i<buffLen.length) { buffL[i]=buffLen[i]; } else { buffL[i]= 0; } } outPut.write(buffL); //发送文件长度字节数组 outPut.flush(); // 把网络流发送出去,否则服务器接收不到 count =0; //读取文件字节,并循环发送 reader = new FileInputStream(file); while ((count = reader.read(buf)) > 0) { ow.write(buf, 0, count); Log.i(Tag, "reading file"); } Log.i(Tag, "开始发送!!"); outPut.write(ow.toByteArray()); outPut.flush(); Log.i(Tag, "文件发送完成!!!"); // client.shutdownOutput(); //一定不能加这句话,否则socket关闭发送流,以后就不能在此发送,这也是问什么用文件字节长度来判断接收结束原因 } catch(Exception e) { System.out.println("socket执行异常:" + e.toString()); }finally { try { // 结束对象 buf = null; // out.close(); //out一定不能关闭,因为同事也会关闭socket // out.close(); // in.close(); reader.close(); // client.close(); } catch (Exception e) { } } } }
完整的工程下载地址(源码):http://download.csdn.net/detail/zhujinghao09/5313666
相关文章推荐
- 网络对讲机C#服务器 Android客户端(二) C#服务器代码分析 附加
- 录音函数网络对讲机C#服务器 Android客户端(二) C#服务器代码分析 附加
- 网络对讲机C#服务器 Android客户端(三) android客户端代码分析
- 网络对讲机C#服务器 Android客户端(三) android客户端代码分析 附加
- 文件接收网络对讲机C#服务器 Android客户端(二) C#服务器代码分析
- 网络对讲机C#服务器 Android客户端(二) C#服务器代码分析
- 网络对讲机C#服务器 Android客户端(一) 项目要求
- 网络对讲机C#服务器 Android客户端(三) android客户端代码分析 附加
- AndroidPN服务器与客户端代码分析
- AndroidPN服务器与客户端代码分析
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- C#做服务器,Android做客户端,完成Socket通信
- Android-通过网络获取xml文件使用pull解析得到服务器中的信息(新闻客户端)
- C#完整聊天室服务器和客户端代码实例
- 基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- 服务器基于PHP CodeIgniter,Android基于Volley实现多文件/图片上传(含服务器,web版和android客户端完整代码)
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- android上传大文件到服务器客户端和服务器端代码
- 代码篇C#网络编程之tcp同步客户端