原文:http://blog.sina.com.cn/s/blog_726233070100nqw7.html
讲解一下android socket ,包括获取数据包,拆包,解包的过程。
有时候应用程序需要从网络上收发一些数据,软件的底层是用socket实习的,android操作系统的内核是linux,开发语言是java,刚好数据存储结构和以c构建的服务器大小头是相反的,所以取到c做的服务器数据时,需要转换一下数据的大小头。这里也一并讲解。
首先是socket
//实例化一个socket(指定服务器ip和端口号,建立有效的TCP/IP的连接)
Socket socket = new Socket(String ip,int
//注意socket实例一个套接字的过程是阻塞的,有必要在辅助线程完成
//获取socketStream
OutputStream outStream = socket.getOutputStream();
//这里在啰唆几句,socketStream 只要不close,这个socket就会一直连接,也就是我们所说的长连接
//输入输出流的定义是:从流输入到内存,叫输入流,反之输出。
//流就相当于一个管道,里面有没有数据,跟流本身没有任何关系
//发送一组byte[]出去
outStream .write(b, 0, len);
//b为一组byte(java中一个byte=16bit,排列顺序为大头在前
//更新流的通道
//接受byte[] 和拆包
int leftLength = 0;
byte[] b = new byte[4096];
while ((leftLength += inputStream.read(b, leftLength, 2048)) > 0) {
讲解一下:ByteHandle.getShort函数
这是我自定义的函数,因为byte[]数据时从c的服务器获取到的,bit编码小头在前,在java中需要转换为大头在前,转换方法如下:(主要思路是计算其偏移量)
public static short getShort(byte[] b, int index) {
public static long getLong(byte[] b, int index) {
举两个例子,多了不想打字了,根据数据类型,将byte重新排列,转换成大头在前,然后return相应数据类型的(object)byte[]就ok了
后记:这一部分虽然很简单,但是有很多细节的东西容易搞错,所以注释相对比较细致。看过的一定要留下你的足迹哦,任何意见和建议欢迎给出!明天继续!