关于C# 对接Http 协议和Socket 协议

首先我们先写一个类,这个类是消息抽象类 packet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.Collections;


    //消息抽象类
    public abstract class Packet:MonoBehaviour
    {

        protected int opcode = -1;// 消息号

        public Packet(int opcode)
        {
            this.opcode = opcode;
        }

        public void setOpcode(int opcode)
        {
            this.opcode = opcode;
        }

        public int getOpcode()
        {
            return this.opcode;
        }




        public abstract void destroy();

    }

接下来我写一个写消息的类,继承上面的消息抽象类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.Collections;


public class LinkWriteOnlyPacket:Packet
{
    protected int wirteLegnth = 0;// 消息体长度
    protected byte[] writeData = null;
    protected byte[] writeData1 = null;
    protected byte[] buf = new byte[64];
    private int writeCount = 0;// 当前写入的二进制长度
    protected bool isFlushed = false;// 写入的二进制是否刷新
    protected bool sendImmediately = true;// 是否及时写出

    /**消息内容前占用的字符*/
    private  const byte ISLONGTH=4;
    public LinkWriteOnlyPacket(int code)
        : base(code)
    {


        if (code % 2 != 0&&code!=0) { 
        Debug.Log("发送消息=" + code );
        }
        //本次发送的消息号
        this.writeShort(code);
        //玩家本次登录的身份秘钥
        this.writeUTF(Player.Pwdkey);
    }


    public int getWriteLength()
    {
        return getWriteData().Length;
    }

    public byte[] getWriteData()
    {
        if (!isFlushed)
        {
            try
            {
                this.flush();
            }
            catch (Exception e)
            {

            }
        }
        return this.writeData;
    }

    public  void flush()   {
        this.writeData = null;
        this.writeData = new byte[writeCount];
        //System.arraycopy(buf, 0, this.writeData, 0, writeCount);
      //  buf.CopyTo(this.writeData,0);
        Array.Copy(buf, this.writeData, writeCount);
        isFlushed = true;
    }

    public  void writeByte(int b)   {
        int newcount = writeCount + 1;
        if (newcount > buf.Length) {
            //buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
            byte[] by = new byte[buf.Length+1];
            buf.CopyTo(by, 0);
            buf = by;
        }
        buf[writeCount] = (byte) b;
        writeCount = newcount;
    }

    public void writeBoolean(bool b)
    {
        writeByte(b ? 1 : 0);
    }

    public  void writeShort(int v)   {
        int newcount = writeCount + 2;
        if (newcount > buf.Length) {

             byte[] by = new byte[buf.Length+2];
            buf.CopyTo(by, 0);
            buf = by;

        }
        buf[writeCount] = (byte) (rightMove(v,8) & 0xFF);
        buf[writeCount + 1] = (byte)(rightMove(v, 0) & 0xFF);
        writeCount = newcount;
    }

    public  void writeInt(int v)   {
        int newcount = writeCount + 4;
        if (newcount > buf.Length) {
            //buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
            byte[] by = new byte[buf.Length+4];
            buf.CopyTo(by, 0);
            buf = by;
        }
        buf[writeCount] = (byte) (rightMove(v,24) & 0xFF);
        buf[writeCount + 1] = (byte) (rightMove(v,16) & 0xFF);
        buf[writeCount + 2] = (byte) (rightMove(v,8) & 0xFF);
        buf[writeCount + 3] = (byte)(rightMove(v, 0) & 0xFF);
        writeCount = newcount;
    }

    public  void writeLong(long v)   {
        int newcount = writeCount + 8;
        if (newcount > buf.Length) {
            //buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
              byte[] by = new byte[buf.Length+8];
            buf.CopyTo(by, 0);
            buf = by;

        }
        buf[writeCount] = (byte) (rightMoves(v,56));
        buf[writeCount + 1] = (byte) (rightMoves(v,48));
        buf[writeCount + 2] = (byte) (rightMoves(v,40));
        buf[writeCount + 3] = (byte) (rightMoves(v,32));
        buf[writeCount + 4] = (byte) (rightMoves(v,24));
        buf[writeCount + 5] = (byte) (rightMoves(v,16));
        buf[writeCount + 6] = (byte) (rightMoves(v,8));
        buf[writeCount + 7] = (byte)(rightMoves(v, 0));
        writeCount = newcount;
    }


    public  void writeFloat(float v)   {
        //writeInt(Float.floatToIntBits(v));
        //writeInt(Convert.ToInt32(v));
        writeInt(BitConverter.ToInt32(BitConverter.GetBytes(v), 0));
        //int s = BitConverter.ToInt32(BitConverter.GetBytes(v), 0);
    }


    public  void writeDouble(double v)   {
        //writeLong(Double.doubleToLongBits(v));
        writeLong(BitConverter.ToInt64(BitConverter.GetBytes(v), 0));
        //long s = BitConverter.ToInt64(BitConverter.GetBytes(v), 0);
    }


    //public void writeUTF(string num)
    //{
    //    byte[] GetByteString = new byte[] { };
    //    GetByteString = System.Text.Encoding.UTF8.GetBytes(num);
    //    // GetByteString = System.Text.Encoding.ASCII.GetBytes(num);//ASCII
    //    //GetByteString = System.Text.Encoding.Unicode.GetBytes(num);//Unicode
    //    writeBytes(GetByteString);
    //}
    int  i= 0;
   public void writeUTF(String str) {
        /**
         * 防止空指针造成异常,出现空指针的时候,写一个空串
         */
        if (str == null) {
            str = "";
        }

        int strlen = str.Length;
        int utflen = 0;
        int c, num = 0;

        for (int j = 0; j < strlen; j++) {
            c = char.Parse(str.Substring(j,1));
            if ((c >= 0x0001) && (c <= 0x007F)) {
                utflen++;
            } else if (c > 0x07FF) {
                utflen += 3;
            } else {
                utflen += 2;
            }
        }

        if (utflen > 65535)
            return;

        byte[] bytearr = new byte[utflen + 2];

        bytearr[num++] = (byte) (rightMove(utflen,8) & 0xFF);
        bytearr[num++] = (byte) (rightMove(utflen,0) & 0xFF);


        for (i = 0; i < strlen; i++) {
           c = char.Parse(str.Substring(i,1));
            if (!((c >= 0x0001) && (c <= 0x007F)))
                break;
            bytearr[num++] = (byte) c;
        }

        for (; i < strlen; i++) {
            c = char.Parse(str.Substring(i, 1));
            if ((c >= 0x0001) && (c <= 0x007F)) {
                bytearr[num++] = (byte) c;

            } else if (c > 0x07FF) {
                bytearr[num++] = (byte) (0xE0 | ((c >> 12) & 0x0F));
                bytearr[num++] = (byte) (0x80 | ((c >> 6) & 0x3F));
                bytearr[num++] = (byte) (0x80 | ((c >> 0) & 0x3F));
            } else {
                bytearr[num++] = (byte) (0xC0 | ((c >> 6) & 0x1F));
                bytearr[num++] = (byte) (0x80 | ((c >> 0) & 0x3F));
            }
        }
        //return bytearr;
        writeBytes(bytearr);
    }



 public  void writeBytes(byte[] bytes)  {
        int newcount = writeCount + bytes.Length;
        if (newcount > buf.Length)
        {
            //buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
            byte[] by = new byte[newcount];
            buf.CopyTo(by, 0);
            buf = by;
        }
        //System.arraycopy(bytes, 0, buf, writeCount, bytes.length);
        Array.Copy(bytes, 0, buf, writeCount, bytes.Length);
        writeCount = newcount;
    }


    public override void destroy() {
        this.writeData = null;
        this.buf = null;
        this.writeData1=null;
    }



    public static long rightMoves(long value, int pos)
    {

        if (pos != 0)  //移动 0 位时直接返回原值
        {
            long mask = 0x7fffffffffffffff; ;     // int.MaxValue = 0x7FFFFFFF 整数最大值
            value >>= 1;     //第一次做右移,把符号也算上,无符号整数最高位不表示正负
            //                                          但操作数还是有符号的,有符号数右移1位,正数时高位补0,负数时高位补1
            value &= mask;     //和整数最大值进行逻辑与运算,运算后的结果为忽略表示正负值的最高位
            value >>= pos - 1;     //逻辑运算后的值无符号,对无符号的值直接做右移运算,计算剩下的位
        }
        return value;
    }




    public static int rightMove(int value, int pos)
    {

        if (pos != 0)  //移动 0 位时直接返回原值
        {
            int mask = 0x7fffffff;     // int.MaxValue = 0x7FFFFFFF 整数最大值
            value >>= 1;     //第一次做右移,把符号也算上,无符号整数最高位不表示正负
            //                                          但操作数还是有符号的,有符号数右移1位,正数时高位补0,负数时高位补1
            value &= mask;     //和整数最大值进行逻辑与运算,运算后的结果为忽略表示正负值的最高位
            value >>= pos - 1;     //逻辑运算后的值无符号,对无符号的值直接做右移运算,计算剩下的位
        }
        return value;
    }



    //public void writeBytes(byte[] bytes)
    //{
    //    int newcount = writeCount + bytes.Length;
    //    if (newcount > buf.Length)
    //    {
    //        //buf = Arrays.copyOf(buf, Math.Max(buf.Length << 1, newcount));
    //        byte[] by = new byte[newcount];
    //        buf.CopyTo(by, 0);
    //        buf = by;
    //    }
    //    //System.arraycopy(bytes, 0, buf, writeCount, bytes.Length);
    //    Array.Copy(bytes, 0, buf, writeCount, bytes.Length);
    //    writeCount = newcount;
    //}


    /**发送http消息*/
    public static void writePacket(string url,byte[] message)
    {
        try
        {
            HttpMessage hs = new HttpMessage();
          //  hs.Ceshi(url,message);
            HttpMessage.sendHttp(url,message);
        }
        catch (Exception e)
        {
        }
    }

    /**发送Socket消息*/
    public static void writeSocketPacket( byte[] message)
    {
        try
        {
            SocketMessage.sendNewToServer(message);
            Debug.Log("writeSocketPacket=over");

        }
        catch (Exception e)
        {
        }
    }
}



然后是一个读取消息的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public abstract class LinkReadAndWritePacket : LinkWriteOnlyPacket
{
protected byte[] readData = null;//读的二进制数据
private int readPosition = 0; //当前读取的位置
protected bool writeLog = false;

protected bool requestCrypt = false;

public LinkReadAndWritePacket(int code, byte[] readData)
    : base(code)
{
    this.readData = readData;
}

public int remaining()
{
    return readData.Length - readPosition;
}

public int readBytes(byte[] bytes)
{
    if (readPosition + bytes.Length > readData.Length)
    {
        //  new BufferOverflowException().printStackTrace();
        return 0;
    }
    for (int i = 0; i < bytes.Length; i++)
    {
        bytes[i] = readData[readPosition++];
    }
    return bytes.Length;
}

public sbyte readByte()
{
    return (sbyte)this.readData[readPosition++];
}


public float readFloat()
{


    return BitConverter.ToSingle(BitConverter.GetBytes(readInt()), 0);

    //  return Float.intBitsToFloat(readInt()); writeInt(BitConverter.ToInt32(BitConverter.GetBytes(v), 0));
    //return readInt(BitConverter.ToDouble(readInt(), 0));
}

public bool readBoolean()
{
    return this.readData[readPosition++] == 1 ? true : false;
}

public short readShort()
{
    return (short)(((readData[readPosition++] << 8) | readData[readPosition++] & 0xff));
}

public int readInt()
{
    int offset = readPosition;
    readPosition += 4;
    return readData[offset + 3] & 0xff | (readData[offset + 2] & 0xff) << 8
     | (readData[offset + 1] & 0xff) << 16 | (readData[offset] & 0xff) << 24;
}

public long readLong()
{
    int offset = readPosition;
    readPosition += 8;
    return (((long)readData[offset] << 56) +
            ((long)(readData[offset + 1] & 255) << 48) +
    ((long)(readData[offset + 2] & 255) << 40) +
            ((long)(readData[offset + 3] & 255) << 32) +
            ((long)(readData[offset + 4] & 255) << 24) +
            ((readData[offset + 5] & 255) << 16) +
            ((readData[offset + 6] & 255) << 8) +
            ((readData[offset + 7] & 255) << 0));
}

public double readDouble()
{
    //  return Double.longBitsToDouble(readLong());
    return BitConverter.ToDouble(BitConverter.GetBytes(readLong()), 0);
}

public int readUnsignedShort()
{
    return (((readData[readPosition++] & 0xff) << 8) | (readData[readPosition++] & 0xff));
}

public short readUnsignedByte()
{
    return (short)(readData[readPosition++] & 0xff);
}

public long readUnsignedInt()
{
    return ((long)(readData[readPosition++] << 24 | readData[readPosition++] << 16
            | readData[readPosition++] << 8 | readData[readPosition++])) & 0xFFFFFFFFL;
}

public String readUTF()
{
    int utflen = readUnsignedShort();
    byte[] bytearr = new byte[utflen];
    char[] chararr = new char[utflen];

    int c = 0, char2 = 0, char3 = 0;
    int count = 0;
    int chararr_count = 0;

    // System.arraycopy(readData, readPosition, bytearr, 0, utflen);
    Array.Copy(readData, readPosition, bytearr, 0, utflen);
    while (count < utflen)
    {
        c = (int)bytearr[count] & 0xff;
        if (c > 127) break;
        count++;
        chararr[chararr_count++] = (char)c;
    }

    while (count < utflen)
    {
        c = (int)bytearr[count] & 0xff;
        switch (c >> 4)
        {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
                count++;
                chararr[chararr_count++] = (char)c;
                break;
            case 12:
            case 13:
                count += 2;
                if (count > utflen)
                    return null;
                //  throw new UTFDataFormatException(
                //     "malformed input: partial character at end");
                char2 = (int)bytearr[count - 1];
                if ((char2 & 0xC0) != 0x80)
                    return null;
                //      throw new UTFDataFormatException(
                //        "malformed input around byte " + count); 
                chararr[chararr_count++] = (char)(((c & 0x1F) << 6) |
                                                (char2 & 0x3F));
                break;
            case 14:
                count += 3;
                if (count > utflen)
                    return null;
                //    throw new UTFDataFormatException(
                //        "malformed input: partial character at end");
                char2 = (int)bytearr[count - 2];
                char3 = (int)bytearr[count - 1];
                if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80))
                    return null;
                //  throw new UTFDataFormatException(
                //       "malformed input around byte " + (count-1));
                chararr[chararr_count++] = (char)(((c & 0x0F) << 12) |
                                                ((char2 & 0x3F) << 6) |
                                                ((char3 & 0x3F) << 0));
                break;
            default:
                return null;
            //    throw new UTFDataFormatException(
            //      "malformed input around byte " + count);
        }
    }
    readPosition += utflen;
    return new String(chararr, 0, chararr_count);
}


public void setReadData(byte[] data)
{
    this.readData = data;
}

public int getReadLength()
{
    return readData == null ? 0 : readData.Length;
}


public override void destroy()
{
    //   super.destroy();
    this.readData = null;
    //  this.channel = null;
}


public bool isWriteLog()
{
    return this.writeLog;
}

public bool isRequestCrypt()
{
    return requestCrypt;
}




public String getActionDetail()
{
    return "";
}

//  public abstract void process();

public long readUnInt()
{
    int offset = readPosition;
    readPosition += 4;
    return (((long)(readData[offset] & 255) << 24) +
            ((readData[offset + 1] & 255) << 16) +
            ((readData[offset + 2] & 255) << 8) +
            ((readData[offset + 3] & 255) << 0));
}

//此方法返回读取后剩余的数据
public byte[] getByteData()
{
    this.writeData = null;
    this.writeData = new byte[readData.Length - readPosition];
    //System.arraycopy(buf, 0, this.writeData, 0, writeCount);
    //  buf.CopyTo(this.writeData,0);
    Array.Copy(readData, readPosition, this.writeData, 0, readData.Length - readPosition);
    return writeData;
}

public abstract void process();

/**
 *所有socket的子协议必须重写此方法
 */
public virtual void socketProcess()
{

}

}

然后写一个LinkBaseReadPacket类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


    class LinkBaseReadPacket:LinkReadAndWritePacket
    {
        public LinkBaseReadPacket(byte[] message):base(0,message) 
        {

        }

        public override void process()
        { }
    }

然后是一个消息解析类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;


/**
  消息解析类
 * 2016.6.24
 */
public class PacketFactory
{

    public static LinkReadAndWritePacket getPacket(int code, byte[] readData)
    {

        GameLoginWnd.Instance.code = code;
        CreateRoleWnd.Instance.code = code;

        Debug.Log("接收消息=" + code);
        switch (code)
        {
            //测试协议
            case 112:
                return new TestStoC(code, readData);
            case 2:
                return new RegisterSTOC(code, readData);
            case 4:
                return new LoginSTOC(code, readData);
            case 102:
                return new LoginsSTOC(code, readData);
            case 104:
                return new CreateRoleSTOC(code, readData);
            case 108:
                return new NameSetSTOC(code, readData);
            case 110:
                return new CheckNameSTOC(code, readData);
            case 8:
                return new GeneralErrorSTOC(code, readData);
            case 106:
                return new EnterGameSTOC(code, readData);
            case 412:
                return new ClientBattleSTOC(code, readData);
            case 402:
                return new GetDupDataSTOC(code, readData);
            case 404:
                return new OpenDuplicateSTOC(code, readData);
            case 602:
                return new GetRankingSTOC(code, readData);
            case 302:
                return new SignSTOC(code, readData);
            case 502:
                return new SystemNoticeSTOC(code, readData);
            case 506:
                return new RoleUpmoneySTOC(code, readData);
            case 406:
                return new RewardDuplicateSTOC(code, readData);
            case 702:
                return new GetLuckySTOC(code, readData);
            case 704:
                return new LuckySTOC(code, readData);
            case 902:
                return new GetEmailSTOC(code, readData);
            case 904:
                return new EmailSTOC(code, readData);
            case 906:
                return new SendEmailSTOC(code, readData);
            case 908:
                return new GiveFriendEnergySTOC(code, readData);
            case 408:
                return new ChapDupRewardSTOC(code, readData);
            case 1002:
                return new LoadFriendListSTOC(code, readData);
            case 1004:
                return new AddFriendSTOC(code, readData);
            case 1006:
                return new AgreedAddFriendSTOC(code, readData);
            case 1008:
                return new DeleteFriendSTOC(code, readData);
            case 1010:
                return new RefuseAddFriendSTOC(code, readData);
            case 1012:
                return new RecommendFriendSTOC(code, readData);

            //
            case 802:
                return new GetDailyTaskArraySTOC(code, readData);
            case 804:
                return new UpdateTaskDataSTOC(code, readData);
            case 1102:
                return new GetShoppingSTOC(code, readData);
            case 1104:
                return new ShoppingSTOC(code, readData);
            case 1106:
                return new ReceiveMallSTOC(code, readData);
            case 134:
                return new HeartSTOC(code, readData);
            case 202:
                return new GetBagGoodsSTOC(code, readData);
            case 204:
                return new UseBagGoodsSTOC(code, readData);
            case 1302:
                return new UpLoadPrintSTOC(code, readData);

            case 116:
                return new GMCommandSTOC(code, readData);
            case 508:
                return new EnergyChangeSTOC(code, readData);
            case 1508:
                return new AddPorintLadderHighMatchSTOC(code, readData);
            case 1510:
                return new FieldVictoryLadderHighMatchSTOC(code, readData);
            case 1502:
                return new SignUpLadderHighSTOC(code, readData);
            case 1504:
                return new StartUpLadderHighMatchSTOC(code, readData);
            case 1506:
                return new UsePropLadderHighMatchSTOC(code, readData);
            case 1512:
                return new LadderHighHalfwayExceptionSTOC(code, readData);


            case 1408:
                return new GetHomemadeShutAddressAndIdSTOC(code, readData);
            case 1406:
                return new ReceiveRewardSTOC(code, readData);
            case 1602:
                return new GetLBSPVEBattleSTOC(code, readData);
            case 1604:
                return new LBSPVEReceiveRewardSTOC(code, readData);

        }
        return null;
    }
}

然后是一个处理http协议服务器响应数据解析的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;


/**
 此类处理http协议服务器响应数据解析
 * 2016.6.24
 */

public class HttpHandler
{
    //消息头长度
    private  const byte ISLONGTH=2;
    public static  void messageReceived(byte[] message)
    {
        //消息小于最小长度
        if (message.Length < ISLONGTH)
        {
            return;
        }
        LinkReadAndWritePacket readpacket = new LinkBaseReadPacket( message);



        //消息包总长度
        int messageCount = readpacket.readShort();

        //如果消息包大于最大值就不往下执行
        if (messageCount >= 65535)
        {
            return;
        }
        int pwdkey = readpacket.readShort();
        //消息号
        int opcode = readpacket.readShort();

       Debug.Log("接收到协议=="+opcode);
        //加密号
        //      int pwdkey=cbuffer.getUnsignedShort(readerIndex);

        LinkReadAndWritePacket packet = PacketFactory.getPacket(opcode, readpacket.getByteData());
        //肯能未来会在此处设置秘钥

        try
        {
            packet.process();
            //此处执行多个消息处理的解析
            while (true)
            {
                byte[] array = packet.getByteData();
                Debug.Log("=查看多包长度=" + array.Length);
                if (array == null || array.Length < ISLONGTH)
                {
                    return;
                }
                packet.destroy();
                packet = null;
                messageReceived(array);
            }
        }
        catch (Exception ex)
        {

        }
        finally
        {
            packet.destroy();
            packet = null;
        }
    }
}

然后是一个发送http消息到服务器

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.IO;
using System;
using System.Threading;
using System.Diagnostics;
using Debug = UnityEngine.Debug;

/**
 此类为http协议请求响应类
 * 所有http请求的发送都要调用此类的send方法
 * 2016.6.24
 */
public class HttpMessage : MonoBehaviour
{



    //发送http消息到服务器

    public static void sendHttp(string url, byte[] message) 
    {
        try
        {
            WWW www_instance = new WWW(url, message);
            Stopwatch sw = new Stopwatch();
            sw.Start();
            byte[] ty = new byte[0];
            while (!www_instance.isDone)
            {
                if (sw.ElapsedMilliseconds >= 1000)
                {
                    if (www_instance.error != null)
                    {
                        Debug.Log("连接超时-----请稍后");
                        MessageBoxWnd.Instance.Show("连接超时---- - 请稍后");
                        sw.Stop();
                        break;
                    }
                    else
                    {
                        if (sw.ElapsedMilliseconds >= 4500)
                        {
                            ty = www_instance.bytes;
                            if (ty.Length == 0)
                            {
                                MessageBoxWnd.Instance.Show("连接超时---- - 请稍后,没有返回数据");
                                sw.Stop();
                                break;
                            }
                        }
                    }
                }
            }
            sw.Stop();
            //yield return www_instance;
            //t = www_instance.bytes;
            //此类处理消息解析
            //Hander(www_instance);
            //   Thread.Sleep(1000);
            //byte[] ty = new byte[0];
            //while (ty.Length == 0)
            //{
            //    try
            //    {
            //         //  Thread.Sleep(1000);
            //           if (www_instance.error != null)
            //           {
            //               Debug.Log("连接超时-----请稍后");
            //               MessageBoxWnd.Instance.Show("连接超时---- - 请稍后");
            //               break;
            //           }
            //           else
            //           {
            //               Debug.Log("hhaa");
            //           //    Thread.Sleep(500);
            //               ty = www_instance.bytes;
            //          //     Thread.Sleep(500);
            //               if (ty.Length == 0)
            //               {
            //                   MessageBoxWnd.Instance.Show("连接超时---- - 请稍后,没有返回数据");
            //                   break;
            //               }
            //           }
            //    }
            //    catch (Exception)
            //    {                   
            //        throw;
            //    }             
            //}
            ty = www_instance.bytes;
            HttpHandler.messageReceived(ty);    
        }
        catch (Exception)
        {
           // throw;
        }



       // StartCoroutine(Hander(www_instance));
        //LinkReadAndWritePacket readpacket = new LinkReadAndWritePacket(t);
        //short one = readpacket.readShort();
        //short two = readpacket.readShort();
        //short three = readpacket.readShort();
        ////   int fore = readpacket.readUnsignedShort();
        //byte a = readpacket.readByte();
        //short b = readpacket.readShort();
        //int c = readpacket.readInt();
        //long d = readpacket.readLong();
        //float e = readpacket.readFloat();
        //double f = readpacket.readDouble();
        //string g = readpacket.readUTF();

        //for (int i = 0; i < t.Length; i++)
        //{
        //    Debug.Log(t[i]);
        //}

    }

    public void Ceshi(string url, byte[] message)
    {
        StartCoroutine(EE());
        //    StartCoroutine(xx(url,message));
        //   xx(url, message);
    }


    IEnumerator EE()
    {
        Debug.Log("dd");
        yield return new WaitForSeconds(2);
        Debug.Log("dd");
    }

    IEnumerator xx(string url, byte[] message)
    {
        WWW www_instance = new WWW(url, message);
        yield return www_instance;
        if (www_instance.isDone)
        {
            HttpHandler.messageReceived(www_instance.bytes);
        }
        if (www_instance.error != null)
        {
            Debug.Log(www_instance.error);
        }
        else
        {
            Debug.Log("hhaa");
        }
    }
}



Socket 协议的两个处理类

using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;

/**
 此类处理http协议服务器响应数据解析
 * 2016.6.24
 */

public class SocketHandler
{
    //消息头长度
    private const byte ISLONGTH = 2;

    public static void messageReceived(byte[] message)
    {
        //Debug.Log("处理http协议服务器");
        //消息小于最小长度
        if (message.Length < ISLONGTH)
        {
            return;
        }
        LinkReadAndWritePacket readpacket = new LinkBaseReadPacket(message);



        //消息包总长度
        int messageCount = readpacket.readShort();

        //如果消息包大于最大值就不往下执行
        if (messageCount >= 65535)
        {
            return;
        }
        int pwdkey = readpacket.readShort();
        //消息号
        int opcode = readpacket.readShort();

        Debug.Log("Socket接收到协议==" + opcode);
        //加密号
        //      int pwdkey=cbuffer.getUnsignedShort(readerIndex);

        LinkReadAndWritePacket packet = PacketFactory.getPacket(opcode, readpacket.getByteData());
        //肯能未来会在此处设置秘钥

        try
        {
            packet.process();
        }
        catch (Exception ex)
        {

        }
        finally
        {
            packet.destroy();
            packet = null;
        }
    }
}

第二个类

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.IO;
using System;
using System.Threading;
using System.Diagnostics;
using Debug = UnityEngine.Debug;
using System.Net.Sockets;
using System.Net;

/**
 此类为Socket协议请求响应类
 * 所有Socket请求的发送都要调用此类的sendNewToServer方法
 * 2016.8.17
 */
public class SocketMessage
{



    //和服务器通讯的socket通道对象
    private static Socket clientSocket = null;


    //接收服务器推送过来的消息
    static Thread readThread;


    private static byte[] result = new byte[50000];


    //如果socket为空生成一个socket对象且和服务器做好链接
    private static void loadSocketStart()
    {
        IPAddress ip = IPAddress.Parse(Player.SocketIP);
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            clientSocket.Connect(new IPEndPoint(ip, 9899)); //配置服务器IP与端口
            receiveNewsToHandle();
        }
        catch
        {
            Console.WriteLine("连接服务器失败,请按回车键退出!");
            return;
        }
    }

    //发送消息给服务器
    public static void sendNewToServer(byte[] sendArray)
    {
        //检查socket通道是否常通过
        if (clientSocket == null)
        {
            loadSocketStart();
        }

        //发送消息给服务器
        clientSocket.Send(sendArray);
        //Console.WriteLine("发送socket成功");
        //Debug.Log("发送socket成功");
    }
    //开启新线程接受消息
    public static void receiveNewsToHandle()
    {
        readThread = new Thread(new ThreadStart(socketHandle));
        readThread.Name = "SocketThread";
        readThread.Start();

    }

    private delegate void Slider(string value);


    //新线程来处理socket阻塞接收服务器推送的消息
    private static void socketHandle()
    {
        while (true)
        {
            int readPosition = clientSocket.Receive(result);
            byte[] buf = new byte[readPosition];
            Array.Copy(result, 0, buf, 0, readPosition);
            //Debug.Log("接收socket长度" + readPosition);
            SocketHandler.messageReceived(buf);
        }
    }
    /// <summary>
    /// 关闭socket连接
    /// </summary>
    public static void closeReceiveThread()
    {
        if (clientSocket != null)
        {
            clientSocket.Close();
        }
        if (readThread != null && readThread.ThreadState != System.Threading.ThreadState.Running)
        {
            readThread.Abort();
        }
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值