讲解一下android socket ,包括获取数据包,拆包,解包的过程。 有时候应用程序需要从网络上收发一些数据,软件的底层是用socket实习的,android操作系统的内核是linux,开发语言是java,刚好数据存储结构和以c构建的服务器大小头是相反的,所以取到c做的服务器数据时,需要转换一下数据的大小头。这里也一并讲解。 首先是socket //实例化一个socket(指定服务器ip和端口号,建立有效的TCP/IP的连接) Socket socket = new Socket(String ip,int port); /** *详细讲解一下,实例化socket,也就是实例化一个套接字 *这个过程是阻塞的,所以使用时需要注意!尽量在线程内完成 */ //获取socketStream OutputStream outStream = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); /** *这里在啰唆几句,socketStream 只要不close,这个socket就会一直连接,也就是我们所说的长连接 *输入输出流的定义是:从流输入到内存,叫输入流,反之输出。 *流就相当于一个管道,里面有没有数据,跟流本身没有任何关系 */ //发送一组byte[]出去 outStream .write(b, 0, len); /** *b为一组byte(java中一个byte=16bit,排列顺序为大头在前) *索引(也可以叫做游标)从0开始到len结束 */ outStream .flush(); /** *这个函数用于刷新流,可以确保数据发送出去 */ //接受byte[] 和拆包 注意:这里的包头为4个字节,前2字节为length,后两字节为type int leftLength = 0; byte[] b = new byte[4096]; while ((leftLength += inputStream.read(b, leftLength, 2048)) > 0) { /**read函数为阻塞函数*/ Log.e(">>>>>>>>>>>>>>>>>>>>>>>>", "leftLength >>> leftLength = " + leftLength); // 此处开始拆包 while (true) { if (leftLength >> length = " + length + " " + state); break; case QUERY_CONF_MSG: // 心跳证实消息 Log.e("message", "type = QUERY_CONF_MSG >>> length = " + length); break; } continue; } else break; } } } 讲解一下:ByteHandle.getShort函数 这是我自定义的函数,因为byte[]数据时从c的服务器获取到的,bit编码小头在前,在java中需要转换为大头在前,转换方法下篇日志!

更多相关文章

  1. 开发Android必备的java基础
  2. Android(安卓)Boot: After kernel stage
  3. Android——layout_marginStart和layout_marginEnd的详细讲解
  4. Android初始化本地数据库
  5. Android仿人人客户端(v5.7.1)——应用主界面之左侧面板UI实现
  6. 1.Android查看手机内部储存目录及数据库文件之通过模拟器Monitor
  7. android通讯录开发
  8. 【自定义控件】android事件分发机制
  9. [Android(安卓)API学习]Data Storage胡乱翻译(2)

随机推荐

  1. c程序的执行是从什么开始到什么结束?
  2. c语言如何求最大值
  3. c语言提供的合法的数据类型关键字是什么?
  4. 对c语言的认识和想法是什么
  5. c语言console.WriteLine什么意思?
  6. c语言中要求对变量作强制定义的主要理由
  7. c语言大小写字母怎么转化?
  8. dev c++怎么用
  9. c语言中do while语句怎么使用
  10. c语言取余符号是什么