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开发工 ...
随机推荐
- 慕课网-安卓工程师初养成-4-14 Java 循环语句之多重循环
来源:http://www.imooc.com/code/1497 循环体中包含循环语句的结构称为多重循环.三种循环语句可以自身嵌套,也可以相互嵌套,最常见的就是二重循环.在二重循环中,外层循环每执行 ...
- cocos2d-x Android版游戏之中国移动SDK嵌入
. 拷贝API 将SDK\runtime\CMBilling20007.jar拷贝至游戏工程的runtime目录下(或其他目录) ,但切记不能放在libs目录下编译,否则编译报错(如:bad rang ...
- Oracle密码过期the password has expired
oracle11G新特征,半年会提醒一次修改新密码 正常情况:只要输入原先帐号密码,回车即可. 不正常情况:输入新密码帐号,回车,提示验证错误,这时就需要切换到没过期的管理员用户,高权限也行,输入 ...
- 学习记录 Java常见的几种字符集以及对 AscII的了解
1.ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...
- App交互demo
Android <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...
- 【MySQl】MyISAM和InnoDB索引对比
部分内容转自:http://www.2cto.com/database/201211/172380.html 比较好的文章:http://www.cnblogs.com/hustcat/archive ...
- Something wrong with FTK's index search results
My friend she told me last week that FTK could not "see" keywords in a plain text files wh ...
- Linkedlist,arrayDeque,HashMap,linkedHashMap
Linkedlist 1.extneds AbstractSequentialList, implements List<E>, Deque<E>, Cloneable, ja ...
- POJ C程序设计进阶 编程题#1:寻找下标
编程题#1:寻找下标 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 已知一 ...
- 数据包判断是否丢包 ping+tracert+mtr
1.用咱们最常用的Ping命令来查看是不是真的丢包了 这里可以看到数据包发送了4个,返回了4个,丢失=0 证明没有丢失 也有可能中间路由做了策略不给ICMP的回应 这样就ping没法判断了 正常情 ...