Android开发Socket实现推送服务 客户端
2013-09-30 10:40
295 查看
使用TCP协议,Socket编程. 服务器端使用PyThon
客户端代码如下:
项目结构:
MainActivity 源码,一个按钮,实现启动服务功能
linkService源码,实现Socket连接服务器,接收数据,发送广播:
注意:in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"gbk")); 接收服务器端的数据编码格式,要一致,不然中文乱码
SocketReceiver 广播接收者,接收广播,弹出吐司提示.
AndroidManifest.xml 项目清单文件 注册服务和广播
客户端代码如下:
项目结构:
MainActivity 源码,一个按钮,实现启动服务功能
Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt=(Button) findViewById(R.id.bt); } @Override public void onClick(View v) {
Intent intent= new Intent(MainActivity.this, linkService.class); startService(intent); }
linkService源码,实现Socket连接服务器,接收数据,发送广播:
注意:in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"gbk")); 接收服务器端的数据编码格式,要一致,不然中文乱码
public class linkService extends Service { Socket socket; PrintWriter out; BufferedReader in; Thread thread; boolean flag=false; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub
thread=new Thread(){ public void run() { link("ip地址", 端口号,"自定义可选"); }; }; thread.start(); return super.onStartCommand(intent, flags, startId); } private void link(String address,int port,String loginId){ // 连接服务器 112.124.22.48 try { socket = new Socket(address, port); socket.setKeepAlive(true); socket.setSoTimeout(600000); // 创建输出流,并发送身份识别用json out = new PrintWriter(socket.getOutputStream()); String strString="{\"UUID\": \""+getUUID()+"\", \"packageName\": \""+getPackageName()+"\", \"loginId\": \""+loginId+"\"}"; System.out.println(strString+"-----------------"); out.println(strString); out.flush(); isServerRun(socket); //创建输入流,读取服务器发送来的消息. android解决socket接收时候的中文名乱码 gbk in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"gbk")); while (true) { int n=0; char[] buffer = new char[1024]; // 读取输入流 while((n=in.read(buffer))!=-1){ Intent intent2 = new Intent(); String xiaoxi= new String(buffer,0,n); intent2.putExtra("xiaoxi",xiaoxi); intent2.setAction("android.intent.action.test");// action与接收器相同 sendBroadcast(intent2); System.out.println(new String(buffer,0,n)+"字数:"+n); } } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private String getUUID(){ final TelephonyManager tm = (TelephonyManager) getBaseContext() .getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice, tmSerial, tmPhone, androidId; tmDevice = "" + tm.getDeviceId(); tmSerial = "" + tm.getSimSerialNumber(); androidId = "" + android.provider.Settings.Secure.getString( getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); UUID deviceUuid = new UUID(androidId.hashCode(), ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode()); String uniqueId = deviceUuid.toString(); return uniqueId; } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); System.out.println("----------Destroy"); } public void isServerRun(Socket socket){ try { socket.sendUrgentData(0xFF); } catch (IOException e) { // TODO Auto-generated catch block try { closeLink(); socket.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Intent intent2 = new Intent(); intent2.putExtra("isRun",false); intent2.setAction("android.intent.action.test");// action与接收器相同 sendBroadcast(intent2); e.printStackTrace(); } } private void closeLink(){ try { out.close(); in.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
SocketReceiver 广播接收者,接收广播,弹出吐司提示.
public class SocketReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub System.out.println("OnReceiver"); // 处理接收到的内容 String xiaoxi = intent.getStringExtra("xiaoxi"); boolean flag=intent.getBooleanExtra("isRun", true); if(!flag){ Toast.makeText(context, "与服务器断开连接", 1).show(); }else{ Toast.makeText(context, xiaoxi, 1).show(); } } }
AndroidManifest.xml 项目清单文件 注册服务和广播
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yingdong.scokettest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.yingdong.scokettest.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="linkService"/> <receiver android:name="SocketReceiver"> <intent-filter> <action android:name="android.intent.action.test"/> </intent-filter> </receiver> </application> </manifest>
相关文章推荐
- android数据库——SQLiteDatabase的Helper类
- Android获得手机电话号码
- Android 之 内存管理
- Android界面-按钮定制-drawable
- Android使用PhotoView实现图片缩放功能
- android不规则按钮的实现方式
- Android 详解之Handler与Looper
- Android应用启动背景图
- Android开发规范
- android开发学习笔记——sqlite操作
- android4.2 屏蔽home键
- android程序闹钟服务的实现
- Android 启动
- android 文件下载与SD卡之间的关系
- @SuppressWarnings一些参数
- 深入浅出学习 Android之Android布局管理:LinerLayout线性布局
- Android(AIDL)自动重复拨号及挂断/接听电话
- Android深入浅出之Audio 第二部分 AudioFlinger分析
- android开发两种退出程序方式(killProcess,System.exit)
- Android局域网发送文件(四)