Android 使用Socket实现服务器与手机客户端的长连接六:二次封装

1、修改原来的连接器
1)在连接时发送信息给服务器

 new Thread(new RequestWorker()).start();

2)把验证码放入队列里

public void auth(String auth) {
        putRequest(auth);
}

3)代码:

public class Connector {
    //ip
    private String dstName = "192.168.1.100";
    //端口
    private int dstPort = 10002;
    private Socket mClientSocket;
    private ConnectorListener mConnectorListener;

    //队列
    private ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(8);

    /**
     * 使用三次握手实现长连接
     */
    public void connect() {
        try {
            if (mClientSocket == null || mClientSocket.isClosed()) {
                mClientSocket = new Socket(dstName, dstPort);
            }
            //发送信息给服务器
            new Thread(new RequestWorker()).start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        InputStream is = mClientSocket.getInputStream();
                        byte[] buffer = new byte[1024];
                        int len = -1;
                        while ((len = is.read(buffer)) != -1) {
                            final String text = new String(buffer, 0, len);
                            System.out.println("text : " + text);
                            if (mConnectorListener != null) {
                                mConnectorListener.pushData(text);
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public class RequestWorker implements Runnable {
        @Override
        public void run() {
            // 数据通讯
            OutputStream os;
            try {
                os = mClientSocket.getOutputStream();
                while (true) {
                    String content = queue.take();
                    os.write(content.getBytes());
                }
            } catch (Exception e) {
                throw new RuntimeException("获取数据失败:" + e.getMessage());
            }

        }
    }

    /**
     * 把验证放入队列
     * @param auth
     */
    public void auth(String auth) {
        putRequest(auth);
    }

    /**
     * 把信息放入队列
     * @param content
     */
    public void putRequest(String content) {
        try {
            queue.put(content);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 断开连接
     */
    public void disconnect() {
        try {
            if (mClientSocket != null && !mClientSocket.isClosed()) {
                mClientSocket.close();
                mClientSocket = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void setConnectorListener(ConnectorListener listener) {
        this.mConnectorListener = listener;
    }

    public interface ConnectorListener {
        void pushData(String data);
    }
}

2、封装管理类

public class ConnectorManager implements ConnectorListener {
    //连接器
    private Connector connector;
    private ConnectorListener mListener;

    private static ConnectorManager instance;
    private ConnectorManager() {    }
    public static ConnectorManager getInstance() {
        if (instance == null) {
            synchronized (ConnectorManager.class) {
                if (instance == null) {
                    instance = new ConnectorManager();
                }
            }
        }
        return instance;
    }

    /**
     * 创建连接发送验证
     * @param auth
     */
    public void connnect(String auth) {
        connector = new Connector();
        connector.setConnectorListener(this);
        connector.connect();
        connector.auth(auth);
    }

    public void connnect(AuthRequest auth) {
        connector = new Connector();
        connector.setConnectorListener(this);
        connector.connect();
        connector.auth(auth.getData());
    }

    public void putRequest(String request) {
        connector.putRequest(request);
    }

    public void putRequest(Request request) {
        connector.putRequest(request.getData());
    }

    @Override
    public void pushData(String data) {
        if (mListener != null) {
            mListener.pushData(data);
        }
    }

    public void setConnectorListener(ConnectorListener listener) {
        this.mListener = listener;
    }

    public interface ConnectorListener {
        void pushData(String data);
    }
}

3、服务类:

public class ConnService extends Service implements ConnectorListener {

    private ConnectorManager mConnManager;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     * 连接服务
     */
    @Override
    public void onCreate() {
        super.onCreate();
        new Thread(new Runnable() {
            @Override
            public void run() {
                mConnManager = ConnectorManager.getInstance();
                mConnManager.setConnectorListener(ConnService.this);
                mConnManager.connect("#A");
            }
        }).start();

    }

    @Override
    public void pushData(String data) {
        Intent intent = new Intent();
        intent.setAction(PushReceiver.ACTION);
        intent.putExtra(PushReceiver.DATA, data);
        sendBroadcast(intent);
    }

}

4、主界面:

public class ClientActivity extends Activity {
    private EditText mEtContent;
    private ConnectorManager mConnectorManager;

    private PushReceiver mPushReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mConnectorManager = ConnectorManager.getInstance();
        mEtContent = (EditText)findViewById(R.id.et);
        //开启服务
        startService(new Intent(this, ConnService.class));

        initReceiver();
    }

    private void initReceiver() {
        mPushReceiver = new PushReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (PushReceiver.ACTION.equals(intent.getAction())) {
                    String response = intent.getStringExtra(PushReceiver.DATA);
                    ToastUtil.show(ClientActivity.this, response);
                }
            }
        };

        IntentFilter filter = new IntentFilter(PushReceiver.ACTION);
        registerReceiver(mPushReceiver, filter);
    }

    /**
     * 发送信息
     * @param view
     */
    public void clickMessage(View view){
        if (!TextUtils.isEmpty(mEtContent.getText())) {
            mConnectorManager.putRequest(mEtContent.getText().toString());
        }
    }


    @Override
    protected void onDestroy() {
        unregisterReceiver(mPushReceiver);
        super.onDestroy();
    }


}

—————————————————————————————————————————————————–

java架构师项目实战,高并发集群分布式,大数据高可用视频教程,共760G

下载地址:

https://item.taobao.com/item.htm?id=555888526201

01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
+
hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门

内容详情:

【入门篇】
J2SE的Socket网络编程应用
J2SE的反射机制高级应用
J2SE高深讲解
JAVA编程思想 中级教程
JAVA编程思想 初级教程
JAVA编程思想 高级教程
基于J2SE的QQ聊天工具开发
我来说说面向对象
【进阶篇】
CRM项目
Eclipse
Hibernate
JAVA WEB开发视频
JAVAWEB开发实战经典-高级案例篇
JAVAWEB
JAVA线程并发教程
java网上在线支付实战视频
java设计模式
jdbc
junit
mybatis
spring mvc
SpringMvc+Spring+MyBatis+Maven整合视频
SpringMVC
Spring
Struts2 开发实战讲解
Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频
Struts
SVN
tomcat
weblogic
WebService从入门到上手企业开发
企业系统OA办公自动化
手机进销存系统
数据结构和算法视频
设计模式系列
【高级篇】
Cas单点登录
Extjs4.1+Spring3.2+hibernate4.1+MySql5商城
Git权威指南
groovy入门视频
Java 8新特性
Lucene
Mongodb
node.js
Nutch相关框架
OA办公自动化系统
Quartz Job定时任务
Solr高级应用视频
Spring Security权限控制
Spring源码解读与设计详析
Struts2源码剖析与架构指导
大型CMS内容管理系统项目
微信入门视频
深入JVM内核—原理、诊断与优化
深入浅出微信公众平台实战开发(微网站、LBS云、Api接口调用、服务号高级接口)
银行接口资料
【架构篇】
ActiveMQ实战
Apache-Tomcat集群搭建
Linux集群
Linux高级架构架构方案及实现指南
Memcached分布式集群
Mysql特级优化课程
Nginx+Tomcat+Memcached群集配置软件包
Nginx服务器搭建
Nginx网站架构实战(Web服务器负载均衡与反向代理)
SOA Dubbo
storm入门到精通
storm集群的搭建
storm项目实战
UML建模
互联网公司技术架构系列
京东B2C平台推荐搜索的实践和思考
京东大数据分析与创新应用
京东大规模存储持续研发
京东电商海量订单处理OFC系统的关键技术
优米网架构设计方案
基于SOA 思想下的百万数据架构
大型网站提速之MySQL优化
大型网站架构设计
大数据高并发架构实战案例
数据优化技术Redis
数据库高并发原理
深入Java程序性能调优
深入浅出MongoDB应用实战集群及系统架构
深度揭秘服务器端内幕
电商网站之Solr应用
系统架构设计师
阿里分布式数据库服务实践
—————————————————————————————————————————————————–

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值