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通讯呢?他的回答很简单就是安全性高,无其他理由!
android开发系列之socket编程的更多相关文章
- 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET
基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...
- Android 开发系列教程之(一)Android基础知识
什么是Android Android一词最早是出现在法国作家维里耶德利尔·亚当1986年发表的<未来夏娃>这部科幻小说中,作者利尔·亚当将外表像人类的机器起名为Android,这就是And ...
- Android开发系列之学习路线图
通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明 ...
- Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...
- [Android开发系列]IT博客应用
1.关于坑 好吧,在此之前先来说一下,之前开的坑,恩,确实是坑,前面开的两个android开发教程的坑,对不起,实在是没什么动力了,不过源码都有的,大家可以参照github这个应用 https://g ...
- Android开发系列之按钮事件的4种写法
经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity ...
- Android开发系列之SQLite
上篇博客提到过SQLite,它是嵌入式数据库,由于其轻巧但功能强大,被广泛的用于嵌入式设备当中.后来在智能手机.平板流行之后,它作为文件型数据库,几乎成为了智能设备单机数据库的必选,可以随着安卓app ...
- Android开发系列之Android项目的目录结构
今天开始正式学习Android开发的种种细节,首先从最基本的概念和操作学起. 首先看一下Android项目的目录结构. 这是我随便建立的一个test项目,我们重点关注一下几个方面的内容: 1.src目 ...
- Android开发系列之搭建开发环境
接触Android好久了,记得09年刚在中国大陆有点苗头的时候,我就知道了google有个Android,它是智能机操作系统.后来在Android出1.5版本之后,我第一时间下载了eclipse开发工 ...
随机推荐
- 【练习】手工生成awr报告
①首先进入$ORACLE_HOME/rdbms/admin目录 [oracle@host02 ~]$ cd $ORACLE_HOME/rdbms/admin 该目录下 [oracle@host02 a ...
- cocos2d-x Android版游戏之中国移动SDK嵌入
. 拷贝API 将SDK\runtime\CMBilling20007.jar拷贝至游戏工程的runtime目录下(或其他目录) ,但切记不能放在libs目录下编译,否则编译报错(如:bad rang ...
- 多线程(二)NSThread
一.NSThread优缺点 优点:NSThread是最轻量级的 缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 二.NSThread的使用 ...
- Web 站点的水平扩展和垂直扩展 (译文)
当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展.选 用哪种策略主要依赖于要解决的问题以及系统资源的限制.在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点.如果你已经有一 ...
- ASPxGridView中批量提交及个别提交的写法
//获取chech box ID protected string GetProtoID() { string protoId = ""; //获取选中的记录Id List< ...
- CSS3之弹性布局
flexbox是CSS3提出的页面布局模块.flexbox可以把列表横向或者纵向排列,并且填满可以延伸到的空间.稍微复杂的布局可以通过嵌套flex container来实现. 利用flexbox可以方 ...
- 【Spring 1】Spring简介
一.Spring简介 首先,Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开 ...
- CLRS:Max_sunsequence_sum O(n*n) O(nlgn) O(n)
#include<stdio.h>#include<stdlib.h>#include<time.h>#define ARRAY_SIZE 1000int buf ...
- 拿搬东西来解释udp tcpip bio nio aio aio异步
[群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信 有打招呼的过程 有建立通道的过程 有保持通道的确认 有具体传输udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧 ...
- form提交时,传递额外的参数
在进行表单提交时,会遇到在提交前增加额外参数的情况,对此有如下几种解决方法: 1. 在表单里使用hidden的input,将参数放到里面. 缺点:在form表单里会增加一些input节点,感觉不爽. ...