zoukankan      html  css  js  c++  java
  • android开发系列之socket编程

         上周在项目遇到一个接口需求就是通讯系列必须是socket,所以在这篇博客里面我想谈谈自己在socket编程的时候遇到的一些问题。

         其实在android里面实现一个socket通讯是非常简单的,我们只需要在代码里面实现一个Socket对象,同时在该对象里面传进一个ip/port,同时设置一些超时时间就可以了。代码如下:

    public class SocketThread extends Thread {
        private String ip = "192.168.129.1";
        private int port = 12344;
        private String TAG = "socket thread";
        private int timeout = 60000;
        private int maxsize = 256;
    
        public Socket client = null;
        OutputStream out;
        InputStream in;
        public boolean isRun = true;
        Handler inHandler;
        Handler outHandler;
        Context context;
        private String tagTip = "===Send===";
    
        public SocketThread(Handler handlerin, Handler handlerout, Context context) {
            inHandler = handlerin;
            outHandler = handlerout;
            this.context = context;
            Log.i(TAG, "创建线程socket");
        }
    
        public void conn() {
            try {
                client = new Socket(ip, port);
                client.setSoTimeout(timeout);
                client.setTcpNoDelay(true);
                in = client.getInputStream();
                out = client.getOutputStream();
            } catch (UnknownHostException e) {
                Log.i(TAG, "连接错误UnknownHostException 重新获取");
                e.printStackTrace();
                conn();
            } catch (IOException e) {
                Log.i(TAG, "连接服务器io错误");
                e.printStackTrace();
            } catch (Exception e) {
                Log.i(TAG, "连接服务器错误Exception" + e.getMessage());
                e.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            conn();
            String line = "";
            while (isRun) {
                try {
                    if (client != null) {
                        Log.i(TAG, "2.检测数据");
                        byte[] temp = new byte[maxsize];
                        int size = 0;
                        while ((size = in.read(temp)) > 0) {
                            Log.i(TAG, "收到数据");
                            byte[] res = new byte[size];
                            System.arraycopy(temp, 0, res, 0, size);
                            for (int i = 0; i < size; i++) {
                                line += res[i] + " ";
                            }
                            Message msg = inHandler.obtainMessage();
                            msg.obj = line;
                            inHandler.sendMessage(msg);
                        }
    
                    } else {
                        Log.i(TAG, "没有可用连接");
                        conn();
                    }
                } catch (Exception e) {
                    Log.i(TAG, "数据接收错误" + e.getMessage());
                    e.printStackTrace();
                }
            }
        }
    
        public void Send(byte[] mess) {
            try {
                if (client != null) {
                    out.write(mess);
                    out.flush();
                    Log.i(tagTip, "发送成功");
                    Message msg = outHandler.obtainMessage();
                    msg.obj = mess;
                    msg.what = 1;
                    outHandler.sendMessage(msg);
                } else {
                    Log.i(TAG, "client 不存在");
                    Message msg = outHandler.obtainMessage();
                    msg.obj = mess;
                    msg.what = 0;
                    outHandler.sendMessage(msg);
                    Log.i(TAG, "连接不存在重新连接");
                    conn();
                }
    
            } catch (Exception e) {
                Log.i(tagTip, "send error");
                e.printStackTrace();
            } finally {
                Log.i(tagTip, "发送完毕");
            }
        }
    
        public void close() {
            try {
                if (client != null) {
                    in.close();
                    out.close();
                    client.close();
                }
            } catch (Exception e) {
                Log.i(TAG, "close err");
                e.printStackTrace();
            }
        }
    }
    

     上面的代码我就简单的实现了一个基于tcp协议的socket通讯,发送的内容信息是byte[],当然如果大家想要使用udp协议或者发送string字符串的话,那么代码还需要重新修改。相信网上的资料很多,这里就不贴代码了。

          其实我最想说的是,socket通讯的过程中,如果发送的是byte[]的话,那么就需要很小心的注意byte前后顺序,同时拼接的过程中如果还涉及一定的加密的话。那么我们还需要很小心的验证加密算法的正确性。

          有一次我问过部门头为什么要使用socket通讯呢?他的回答很简单就是安全性高,无其他理由!

  • 相关阅读:
    自己封装的json工具类
    使用BigDecimal进行精确计算工具类
    keytool的使用
    自己封装的数字证书签名及签名验证方法,附带生成证书的语句
    用jxl导出数据到excel
    用jxl解析excel内容
    html的<marquee></marquee>标签实现滚动效果
    request、response 中文乱码问题与解决方式
    httpclient4.3.6/httpcore-4.4自己封装的工具类
    Tomcat优化总结
  • 原文地址:https://www.cnblogs.com/xiaocai20091687/p/android-xiaocai-socket.html
Copyright © 2011-2022 走看看