Socket for android 简单实例
最近在实现socket通信,所以写个demo来简单实现下。我用了一种是原始的socket实现,另一种是MINA框架来实现的。
下载demo:http://download.csdn.net/detail/qq_29774291/9826648
一.先看第一种方法
a)、创建Socket对象,指明需要连接的服务器的地址和端口。
b)、建立连接后,通过输出流向服务器发送请求信息。
c)、通过输入流获取服务器的响应信息。
d)、关闭响应资源
如下是主要代码
package com.item.item.sock.socket; import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress; /**
* Socket 通信
*/
public class MyServiceOne extends Service {
private Socket socket;
private BufferedReader in = null;
private BufferedWriter out = null;
private boolean close = true;
private Thread readThread; @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
} @Override
public void onCreate() {
super.onCreate();
close = true;
new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
for(;;){
try {
count++;
SocketAddress socketAddress = new InetSocketAddress(ConnectUtils.HOST,ConnectUtils.POST);
socket = new Socket();
socket.connect(socketAddress,10000);
if(socket.isConnected()){
System.out.println("socket 连接成功");
in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
out =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
//发送一个消息
out.write("start");
out.flush();
//开启一个线程来读取服务器发来的消息
readThread.start();
break;
}
}catch (Exception e){
if(count > ConnectUtils.IDLE_TIME){
break;
}else {
SystemClock.sleep(5000);
}
}
}
}
}).start();
readThread = new Thread(new Runnable() {
@Override
public void run() {
while (close){
String readtext = readText(socket);
if(readtext !=null){
System.out.println("服务器发来的消息:" + readtext);
}
}
}
});
} private String readText(Socket socket) {
String string = null;
if(socket.isConnected()){
try {
char[] buffer = new char[8000];
int count = 0;
if((count = in.read(buffer)) > 0){
char[] temp = new char[count];
for(int i=0;i<count;i++){
temp[i] = buffer[i];
}
string = new String(temp);
}
}catch (Exception e){
string = null;
}
}
return string;
} @Override
public void onDestroy() {
super.onDestroy();
close = false;
if(socket != null){
try {
socket.close();
socket = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
二.第二种方法是用MINA框架实现的
package com.item.item.sock.socket; import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log; import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.service.IoService;
import org.apache.mina.core.service.IoServiceListener;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector; import java.net.InetSocketAddress;
import java.nio.charset.Charset; /**
* 使用MINA框架实现socket通信
* 由于接受消息会阻塞Android线程,所以开在子线程中(同时将其放在Service中,让其在后台运行)
*/
public class MyServiceTwo extends Service {
private String TAG = "jiejie";
private IoSession session = null;
private MinaClientHandler minaClientHandler;
private NioSocketConnector connector = null;
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
} @Override
public void onCreate() {
super.onCreate();
minaClientHandler = new MinaClientHandler();
new Thread(new Runnable() {
@Override
public void run() {
//创建连接客户端
connector = new NioSocketConnector();
//设置连接超时时间
connector.setConnectTimeoutMillis(30000);
//添加过滤器
connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
//设置接收缓冲区大小
connector.getSessionConfig().setReadBufferSize(1024);
//设置处理器
connector.setHandler(minaClientHandler);
//设置默认方位地址
connector.setDefaultRemoteAddress(new InetSocketAddress(ConnectUtils.HOST,ConnectUtils.POST));
//添加重连监听
connector.addListener(new IoListener(){
@Override
public void sessionDestroyed(IoSession ioSession) throws Exception {
int count = 0;
for(;;){
try {
count++;
ConnectFuture future = connector.connect();
future.awaitUninterruptibly();//等待连接创建完成
session = future.getSession();//获取session
if(session.isConnected()){
System.out.println("断线了 但是又重连了");
count = 0;
break;
}
}catch (Exception e){
if(count > ConnectUtils.IDLE_TIME){
break;
}else {
SystemClock.sleep(5000);
}
}
}
}
});
for(;;){
try {
ConnectFuture future = connector.connect();
future.awaitUninterruptibly();
System.out.println("socket 连接成功");
session = future.getSession();
session.write("start");
break;
}catch (Exception e){
SystemClock.sleep(5000);
}
}
}
}).start();
} @Override
public void onDestroy() {
super.onDestroy();
connector.dispose();
} private class MinaClientHandler extends IoHandlerAdapter{
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
super.exceptionCaught(session, cause);
Log.d(TAG,"exceptionCaught--------" + cause);
} @Override
public void messageReceived(IoSession session, Object message) throws Exception {
super.messageReceived(session, message);
Log.d(TAG,"messageReceived---------" + message );
} @Override
public void messageSent(IoSession session, Object message) throws Exception {
super.messageSent(session, message);
Log.d(TAG,"messageSent-------" + message);
} @Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
Log.d(TAG,"sessionClosed-------");
} @Override
public void sessionCreated(IoSession session) throws Exception {
super.sessionCreated(session);
Log.d(TAG,"sessionCreated------" + session);
} @Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
Log.d(TAG,"sessionOpened---------");
}
} /**
* 创建一个监听器实现mina的IoServiceListener接口,里面的方法可以不用实现
*/
private class IoListener implements IoServiceListener{ @Override
public void serviceActivated(IoService ioService) throws Exception { } @Override
public void serviceIdle(IoService ioService, IdleStatus idleStatus) throws Exception { } @Override
public void serviceDeactivated(IoService ioService) throws Exception { } @Override
public void sessionCreated(IoSession ioSession) throws Exception { } @Override
public void sessionClosed(IoSession ioSession) throws Exception { } @Override
public void sessionDestroyed(IoSession ioSession) throws Exception { }
}
}
三.对于粘包的处理 是建立临时缓冲区来处理
public synchronized void Decode(char[] data)
{
for (int i = 0; i < data.length; i++)
{
char byt = data[i];
this.temp.add(byt);
if (byt == '"')
{
if (!this.instring)
{
this.instring = true; }
else if (getPrev() != '\\')
{
this.instring = false;
}
} if (instring) continue;
if (byt == '}' || byt == ']')
{
end = true;
left--;
}
if (byt == '{' || byt == '[')
{
left++;
}
if ((left) < 0)
{
temp.clear();
this.instring = false;
this.left = 0;
continue;
} if (end && left == 0)
{
end = false;
char[] p =new char[temp.size()];
// temp.toArray(p) ;//完整协议包
for(int j =0; j< temp.size();j++){
p[j] = temp.get(j);
} // todo : log
// if (OnPackageHanded != null) {
// OnPackageHanded(package);
// }
if(this.HandledPackage.size()>100){ this.HandledPackage.poll();
}
this.HandledPackage.offer(p);
temp.clear();
this.instring = false;
this.left = 0;
continue;
} }
}
Socket for android 简单实例的更多相关文章
- JAVA SOCKET编程单线程简单实例
服务端: package socketProgram; import java.io.BufferedReader;import java.io.IOException;import java.io. ...
- Socket使用及简单实例
一.搭建服务器端 a).创建ServerSocket对象绑定监听端口. b).通过accept()方法监听客户端的请求. c).建立连接后,通过输入输出流读取客户端发送的请求信息. d).通过输出流向 ...
- 【转】Android Https服务器端和客户端简单实例
转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...
- 一个简单的Android小实例
原文:一个简单的Android小实例 一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台 3.安装J ...
- Android Fragment 简单实例
Android上的界面展示都是通过Activity实现的.Activity实在是太经常使用了.我相信大家都已经很熟悉了,这里就不再赘述. 可是Activity也有它的局限性,相同的界面在手机上显示可能 ...
- android Jni NDK开发环境搭建及其简单实例的编写
android Jni NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...
- Win Socket编程原理及简单实例
[转]http://www.cnblogs.com/tornadomeet/archive/2012/04/11/2442140.html 使用Linux Socket做了小型的分布式,如Linux ...
- Linux C Socket编程原理及简单实例
部分转自:http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx 1. 什么是TCP/IP.UDP? 2. Socket在哪里 ...
- SpringMVC笔记——SSM框架搭建简单实例
落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...
随机推荐
- wireshark 抓包
Wireshark(前称Ethereal)是一个网络数据包分析软件.网络数据包分析软件的功能是截取网络数据包,并尽可能显示出最为详细的网络数据包数据.Wireshark使用WinPCAP作为接口,直接 ...
- Java 8学习之Stream API
一个Stream表面上看与一个集合很类似,允许你改变和获取数据.但是实际上他与集合是有很大区别的: Stream自己不会存储元素.元素可能被存储在底层的集合中,或者根据需要产生出来. Stream操作 ...
- i.mx6 Android5.1.1 System server
1. 概述: 1. Zygote进程是Android Java世界的开创者,所有的Java应用程序进程都由Zygote进程创建: 2. Zygote创建应用程序进程过程其实就是复制自身进程地址空间作为 ...
- Gin实战:Gin+Mysql简单的Restful风格的API(二)
上一篇介绍了Gin+Mysql简单的Restful风格的API,但代码放在一个文件中,还不属于restful风格,接下来将进行进一步的封装. 目录结构 ☁ gin_restful2 tree . ├─ ...
- [转]微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
本文转自:http://blog.csdn.net/qq_31383345/article/details/53014610 今天遇到微信小程序的用户头像设置功能,做笔记. 先上gif: 再上代码: ...
- [转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
本文转自:http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然 ...
- Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案
原文出自:https://blog.csdn.net/seesun2012 这是一个execl文件导入数据库操作,使用jxl解析execl导入数据库过程出现了科学计数法,与想要导入的数据不匹配,以下是 ...
- this,小心!
this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在JS中,由于 javascript的动态性(解释执行,当然也有简单的预编译过程),this ...
- IE8实现媒体查询
IE8实现媒体查询 实现IE8引用样式 <!--[if IE 8]> 仅IE8可识别 <style> @import "Index.css"; } < ...
- ashx+jsonp+document.referrer
-- 一年前学的JSONP 跨域,一年后的今天相关知识点基本忘光.花了一天时间重新学习,再次感谢各位前辈的帖子,特此记录如下. --html <!DOCTYPE html PUBLIC &quo ...