博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android开发系列之socket编程
阅读量:5282 次
发布时间:2019-06-14

本文共 3909 字,大约阅读时间需要 13 分钟。

     上周在项目遇到一个接口需求就是通讯系列必须是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通讯呢?他的回答很简单就是安全性高,无其他理由!

转载于:https://www.cnblogs.com/xiaocai20091687/p/android-xiaocai-socket.html

你可能感兴趣的文章
字符串的排列
查看>>
解决Asp.net MVC3下Web.config开启Custom Errors后Application_Error不触发问题
查看>>
SQL 游标
查看>>
Java9+版本中,Interface的内容
查看>>
从0開始学习 GitHub 系列之「07.GitHub 常见的几种操作」
查看>>
OTRS
查看>>
GDB 调试程序
查看>>
浮点数精度问题
查看>>
ORA-00054 资源正忙
查看>>
HDU-1527 取石子游戏
查看>>
使用element 遇到与项目主题颜色不一致问题
查看>>
如何使用Jenkins进行持续集成测试
查看>>
玩转Android之Drawable的使用
查看>>
一个电商项目的功能模块梳理2
查看>>
JNI 学习笔记系列(二)
查看>>
翻译《虚幻引擎4艺术大师 - 蓝图 II 》 中文版
查看>>
武汉群硕面试简历
查看>>
十年等待,幸福人生
查看>>
poj 1860 Currency Exchange SPFA
查看>>
小白 stl map
查看>>