Socket for android 简单实例

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

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;

}

}

}

欢迎加入技术交流群:364595326

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,486评论 1 114
  • 1、不安全的随机数生成,在CSRF TOKEN生成、password reset token生成等,会造成toke...
    nightmare丿阅读 3,573评论 0 1
  • 1. 前几天,我在大学同学Maggie的朋友圈看到这样一大段话: 每次孩子在学校受了委屈、发生矛盾、甚至被人欺负了...
    万伊刀阅读 5,070评论 69 88