zoukankan      html  css  js  c++  java
  • android socket 网络数据传输

    原文: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  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是一个阻塞的线程,所以不必考虑这里出现死循环,有数据则返回值>0
             Log.e(">>>>>>>>>>>>>>>>>>>>>>>>", "leftLength  >>>  leftLength = " + leftLength);
             // 此处开始拆包

        while (true) {
                if (leftLength < 4)
                     break;
                 else {
                     int length = ByteHandle.getShort(b, 0);
                     if (length <= leftLength) {
                          int type = ByteHandle.getShort(b, 2);
                          byte[] buf = new byte[length]; 
                          System.arraycopy(b, 0, buf, 0, length);
                          System.arraycopy(b, length, b, 0, leftLength - length);
                          leftLength -= length;
                              switch (type) {
                              case REG_REQ_CNF_MSG:

  • 相关阅读:
    Java中如何实现序列化,有什么意义?
    java中this和super关键字的作用
    java中String类的面试题大全含答案
    java中static关键字的作用
    final和abstract关键字的作用
    Java.util.Map的实现类有那些?
    java.sql.Date和java.util.Date的联系和区别
    Java 的信号灯
    java.lang.ThreadLocal的作用和原理?列举在哪些程序中见过ThreadLocal的使用?
    HashMap是不是有序的?
  • 原文地址:https://www.cnblogs.com/zt1175576678/p/4156261.html
Copyright © 2011-2022 走看看