上周在项目遇到一个接口需求就是通讯系列必须是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编程的更多相关文章

  1. 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET

    基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...

  2. Android 开发系列教程之(一)Android基础知识

    什么是Android Android一词最早是出现在法国作家维里耶德利尔·亚当1986年发表的<未来夏娃>这部科幻小说中,作者利尔·亚当将外表像人类的机器起名为Android,这就是And ...

  3. Android开发系列之学习路线图

    通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明 ...

  4. Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结

    前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...

  5. [Android开发系列]IT博客应用

    1.关于坑 好吧,在此之前先来说一下,之前开的坑,恩,确实是坑,前面开的两个android开发教程的坑,对不起,实在是没什么动力了,不过源码都有的,大家可以参照github这个应用 https://g ...

  6. Android开发系列之按钮事件的4种写法

    经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity ...

  7. Android开发系列之SQLite

    上篇博客提到过SQLite,它是嵌入式数据库,由于其轻巧但功能强大,被广泛的用于嵌入式设备当中.后来在智能手机.平板流行之后,它作为文件型数据库,几乎成为了智能设备单机数据库的必选,可以随着安卓app ...

  8. Android开发系列之Android项目的目录结构

    今天开始正式学习Android开发的种种细节,首先从最基本的概念和操作学起. 首先看一下Android项目的目录结构. 这是我随便建立的一个test项目,我们重点关注一下几个方面的内容: 1.src目 ...

  9. Android开发系列之搭建开发环境

    接触Android好久了,记得09年刚在中国大陆有点苗头的时候,我就知道了google有个Android,它是智能机操作系统.后来在Android出1.5版本之后,我第一时间下载了eclipse开发工 ...

随机推荐

  1. 慕课网-安卓工程师初养成-3-9 Java中运算符的优先级

    来源 http://www.imooc.com/code/1315 所谓优先级,就是在表达式中的运算顺序.Java 中常用的运算符的优先级如下表所示: 级别为 1 的优先级最高,级别 11 的优先级最 ...

  2. redis错误总结

    1.同步错误.不停重试一直不成功 Full resync from master: e51165e2868c541e28134a287f9bfe36372bae34:80575961684 MASTE ...

  3. noi2010 能量采集

    2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 3068  Solved: 1820 [Submit][Sta ...

  4. android Camera使用(一)

    现在的App不可避免的要使用到手机的相机功能 首先我们先来介绍下最简单的一个实现方式,启动系统自带的Activity 上代码: public void openCamera() { Intent i= ...

  5. asp.net 在线人数

    很网站都有在线人数,这一功能无处不在.现在,我们就介绍在.NET中一个简单明了的方法来统计在线用户的多少,该方法的特点就是充分的利用了ASP.NET的特点,结合global.asax文件,用Appli ...

  6. 简短总结一下C#里跨线程更新UI

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  7. Android 按键式事件

    1. package com.fish.helloworld; import android.app.Activity; import android.graphics.Color; import a ...

  8. Linux系统在嵌入式硬件上的移植

    =========================        基本常识       ========================= 一. Linux系统的基本构成: 1. loader 2.  ...

  9. Django搭建及源码分析(一)

    一.关于Django以下两个站点,在使用方面有详细说明. http://www.nowamagic.net/academy/part/13/286 http://www.w3cschool.cc/dj ...

  10. 软件工程 speedsnail 冲刺5

    2015-5-9 完成任务:学习了黑马android教学视频10\11\12集,填写游戏人的姓名功能为明天的记分板准备: 遇到问题: 问题1 Suspicious method call; shoul ...