当前位置:操作系统 > 安卓/Android >>

android网游开发之socket的简单设计和实现

对于普通应用的网络模块一般使用http文本协议,在android开发中使用http协议比较简单,sdk已经做了很好的封装了,具体使用方法可以参考我的这篇博文。而在游戏开发中,可以结合使用http和socket,当然了http协议底层也是基于tcp协议的。http协议是无连接、无状态的,每次连接只能处理一个请求,然后就断了,而且发一个请求需要附加额外信息(请求行、请求头),每次请求都需要重新建立连接;使用socket的好处是更高效和省流量,建立一次连接后,只要不手动或者出现异常断开,就可以一直互相发送数据,而且是直接以字节的形式发送,不需要额外的附加信息,缺点就是难度加大了,需要服务端和客户端很好的配合,保证发送和读取时数据的顺序一致。本文通过一个简单的demo介绍开发android网游时socket的使用方法,主要包括:android客户端和一个简单的使用java实现的server端,实现客户端和服务端互相发送数据的功能。
1.客户端代码实现
首先创建一个Android应用,名称:AndroidSocketTest
然后分别创建4个文件:BytesUtil.java、BytesReader.java、BytesWriter.java、TCPCommunication.java,下面分别介绍这几个文件的用处和源码:
BytesUtil.java:包含了一些静态工具方法:基本类型和字节数组的相互转换,字符串和字节数组的相互转换,字节数组的赋值和大小重置,对输入流进行读取保存等。比较简单,下面直接看源码:
[java]
/**
author:alexzhou 
email :zhoujiangbohai@163.com
date  :2012-11-7
 **/ 
  
public final class BytesUtil { 
  
    /**
     *整型转换成字节数组 
     * @param value 要转换的整型值
     * @return
     */ 
    public static byte[] shortToBytes(int value) { 
        byte []write = new byte[2]; 
        write[0] = (byte)( (value >>> 8) & 0xFF); 
        write[1] = (byte)( (value >>> 0) & 0xFF); 
        return write; 
    } 
  
    public static byte[] intToBytes(int value) { 
        byte []write = new byte[4]; 
        write[0] = (byte)( (value >>> 24) & 0xFF); 
        write[1] = (byte)( (value >>> 16) & 0xFF); 
        write[2] = (byte)( (value >>> 8) & 0xFF); 
        write[3] = (byte)( (value >>> 0) & 0xFF); 
        return write; 
    } 
  
    public static byte[] longToBytes(long value) { 
        byte []write = new byte[8]; 
        write[0] = (byte)( (value >>> 56) & 0xFF); 
        write[1] = (byte)( (value >>> 48) & 0xFF); 
        write[2] = (byte)( (value >>> 40) & 0xFF); 
        write[3] = (byte)( (value >>> 32) & 0xFF); 
        write[4] = (byte)( (value >>> 24) & 0xFF); 
        write[5] = (byte)( (value >>> 16) & 0xFF); 
        write[6] = (byte)( (value >>> 8) & 0xFF); 
        write[7] = (byte)( (value >>> 0) & 0xFF); 
        return write; 
    } 
  
    /**
     * 字节数组转换成整型
     * @param value
     * @return
     */ 
    public static int bytesToInt(byte []value) { 
        int i1 = (value[0] & 0xFF) << 24; 
        int i2 = (value[1] & 0xFF) << 16; 
        int i3 = (value[2] & 0xFF) << 8; 
        int i4 = (value[3] & 0xFF) << 0; 
        return (i1 | i2 | i3 | i4); 
    } 
  
    public static short bytesToShort(byte[] value) { 
        int s1 = (value[0] & 0xFF) << 8; 
        int s2 = (value[1] & 0xFF) << 0; 
        return (short)(s1 | s2); 
    } 
  
    public static long bytesToLong(byte[] value) { 
        long L1 = (value[0] & 0xFF) << 56; 
        long L2 = (value[1] & 0xFF) << 48; 
        long L3 = (value[2] & 0xFF) << 40; 
        long L4 = (value[3] & 0xFF) << 32; 
        long L5 = (value[4] & 0xFF) << 24; 
        long L6 = (value[5] & 0xFF) << 16; 
        long L7 = (value[6] & 0xFF) << 8; 
        long L8 = (value[7] & 0xFF) << 0; 
        return (L1 | L2 | L3 | L4 | L5 | L6 | L7 | L8); 
    } 
  
    /**
     * 从指定字节数组中拷贝部分数据
     * @param origin
     * @param from
     * @param to
     * @return
     */ 
    public static byte[] copyBytes(byte[] origin,int from,int to) { 
        int len = to - from; 
        if(len < 0 || origin.length - from <= 0) { 
            throw new IllegalArgumentException("copyBytes->error arguments:to="+to+",from="+from); 
        } 
        byte[] ret = new byte[len]; 
        if(len == 0) return ret; 
        System.arraycopy(origin, from, ret, 0, Math.min(len, origin.length - from)); 
        return ret; 
    } 
  
    /**
     * 重置字节数组的大小,然后把原内容复制到新的字节数组中
     * @param origin
     * @param newSize
     * @return
     */ 
    public static byte[] resizeBytes(byte[] origin,int newSize) { 
        if(newSize < 0) { 
        

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,