您的位置:首页 > 移动开发 > Android开发

Android开发Socket实现推送服务 客户端

2013-09-30 10:40 295 查看
使用TCP协议,Socket编程. 服务器端使用PyThon

客户端代码如下:

项目结构:



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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: