测试Socket协议

package com.hf_socket;

import android.app.Activity;
import android.os.Looper;
import android.os.Message;
import android.provider.Settings;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/7/16.
 */

public class MyClientTest implements Runnable {
    public static Socket client = null;
    public String serverIP="";
    public  boolean socketState= true;
    public Message msg;
    String TAG="RIDi测试==";

    public final String  Download="26";//0x26
    public final String  DownloadCommandSucceed="62";//0x62
    public final String  DownloadFileSucceed="E2";//0xE2
    public final String  ResendCommand ="E2";//0xE2

    public Socket_Activity.SocketHandler socketHandler;
    public MyClientTest(String serverIP, Socket_Activity.SocketHandler handler) {
        this.serverIP=serverIP;
        this.socketHandler=handler;
        this.msg=new Message();
    }

    @Override
    public void run() {
        Looper.prepare();
        socketState=true;
        try {
            client = new Socket(serverIP, 9000);
            client.setKeepAlive(true);
            client.setSoTimeout(5000);
            client.setTcpNoDelay(true);
            client.setSoLinger(true, 4);
            InputStream instream =client.getInputStream();
            OutputStream outstream =client.getOutputStream();
            while (socketState== Utils.network(MyApplication.getContext())) {
                long  needSendfileLength= 1024;//Utils.getFileLength(MyApplication.PERSIN_IDENTIFY_FILE);
                byte[] mm= getWrite("FF55","26",40,2000,1,"tmp48A.tmp",needSendfileLength,"AAEE");
                Log.e("发送数据==",""+mm.length);
                outstream.write(mm);






                byte[] bufferAll = new byte[1024];
                int readLength = instream.read(bufferAll, 0, 1024);//协议数据 receive Datalength <1024
                // frameHeader=2byte state=1byte packageLength=4byte dataBody=packageLength(byte) checksum=8byte frameTail=2byte
                //dataBody【Version=4byte  FileType=1byte FileName=10byte FileLength=8byte 】
                //Determine the heads
                Log.e(TAG+"链接成功==","读取字节个数=="+readLength);
                byte[] bufferFH = new byte[4];
                System.arraycopy(bufferAll,0,bufferFH,0,bufferFH.length);
                String FH= Tools.hexStr2Str(Tools.Bytes2HexString(bufferFH,bufferFH.length));//The frame Tail ; 46463535=FF55

                byte[] bufferFT = new byte[4];
                System.arraycopy(bufferAll,readLength-bufferFT.length,bufferFT,0,bufferFT.length);
                String FT= Tools.hexStr2Str(Tools.Bytes2HexString(bufferFT,bufferFT.length));//The frame Tail

                Log.e(TAG+"==","==bufferFH=="+FH+"==bufferFT=="+FT);


                if((FH.contains("FF55")||FH.contains("ff55"))&&
                        (FT.contains("AAEE")||FT.contains("aaee"))){
                    byte[] bufferSTSTE = new byte[2];
                    int stateIndex=bufferFH.length;
                    System.arraycopy(bufferAll,stateIndex,bufferSTSTE,0,bufferSTSTE.length);
                    String STSTE= Tools.hexStr2Str(Tools.Bytes2HexString(bufferSTSTE,bufferSTSTE.length));//3236
                    Log.e(TAG+"",STSTE+"==STSTE==");

                    byte[] bufferPACKAGELENGTH = new byte[8];
                    int dataLengthIndex=stateIndex+bufferSTSTE.length;
                    System.arraycopy(bufferAll,dataLengthIndex,bufferPACKAGELENGTH,0,bufferPACKAGELENGTH.length);
                    String dataLength= Tools.hexStr2Str(Tools.Bytes2HexString(bufferPACKAGELENGTH,bufferPACKAGELENGTH.length));
                    int PACKAGELENGTH = Integer.valueOf(dataLength,16);
                    Log.e(TAG+"==","==PACKAGELENGTH=="+PACKAGELENGTH);

                    //判断包长 与读取个数是否相等
                   // if(PACKAGELENGTH==(readLength+12) ){
                        byte[] bufferVERSION = new byte[8];
                        int versionIndex=dataLengthIndex+bufferPACKAGELENGTH.length;
                        System.arraycopy(bufferAll,versionIndex,bufferVERSION,0,bufferVERSION.length);
                        String version= Tools.hexStr2Str(Tools.Bytes2HexString(bufferVERSION,bufferVERSION.length));
                        int VERSION = Integer.valueOf(version,16);

                        Log.e(TAG+"==","==VERSION=="+VERSION);
                        byte[] bufferFILETYPE = new byte[2];
                        int filetypeIndex= versionIndex+bufferVERSION.length;
                        System.arraycopy(bufferAll,filetypeIndex,bufferFILETYPE,0,bufferFILETYPE.length);
                        String filetype= Tools.hexStr2Str(Tools.Bytes2HexString(bufferFILETYPE,bufferFILETYPE.length));
                        int  FILETYPE= Integer.valueOf(filetype,16);
                        Log.e(TAG+"==","==FILETYPE=="+FILETYPE);

                        byte[] bufferFILENAME = new byte[20];
                        int fileNameIndex=filetypeIndex+bufferFILETYPE.length;
                        System.arraycopy(bufferAll,fileNameIndex,bufferFILENAME,0,bufferFILENAME.length);
                        String   fileName = new String(bufferFILENAME, 0, bufferFILENAME.length, "utf-8");
                        String FILENAME= Tools.hexStr2Str(fileName);
                        Log.e(TAG+"==","==FILENAME=="+"=="+FILENAME);


                        byte[] bufferCHECKSUM = new byte[4];//CHECKSUM define=8byte,but  read=2byte
                        System.arraycopy(bufferAll,readLength-bufferFT.length-bufferCHECKSUM.length,bufferCHECKSUM,0,bufferCHECKSUM.length);
                        String checkSum= Tools.hexStr2Str(Tools.Bytes2HexString(bufferCHECKSUM,bufferCHECKSUM.length));//The checksum
                        long CHECKSUM=   Long.valueOf(checkSum,16);
                        Log.e(TAG+"CHECKSUM==","=="+CHECKSUM);


                        byte[] bufferFILELENGTH = new byte[16];
                        int fileLengthindex= readLength-bufferFT.length-bufferCHECKSUM.length-bufferFILELENGTH.length;
                        System.arraycopy(bufferAll,fileLengthindex,bufferFILELENGTH,0,bufferFILELENGTH.length);
                        String fileLength= Tools.hexStr2Str(Tools.Bytes2HexString(bufferFILELENGTH,bufferFILELENGTH.length));
                        long FILELENGTH=Long.parseLong(fileLength,16);
                        Log.e(TAG+"==","==FILELENGTH=="+FILELENGTH);
                        //校验和
                        byte[] check1 = Utils.byteMerger(bufferFH,bufferPACKAGELENGTH);
                        byte[] check2 = Utils.byteMerger(check1, bufferVERSION);
                        byte[] check3 = Utils.byteMerger(check2, bufferFILETYPE);
                        byte[] check4 = Utils.byteMerger(check3, bufferFILELENGTH );
                        byte[] check5 = Utils.byteMerger(check4, bufferFILENAME);
                        long  sum=0;
                        for(int i=0;i<check5.length;i++){
                            sum+=check5[i];
                        }
                        if(sum==CHECKSUM){
                            Log.e("判断校验和成功!sum=="+sum,"==CHECKSUM=="+CHECKSUM);

                        }

                        //请求下发数据
                 //   }else{
                        //请求重发
//                        long  needSendfileLength1= 1024;//Utils.getFileLength(MyApplication.PERSIN_IDENTIFY_FILE);
//                        getWrite("FF55","26",40,2000,1,"tmp48A.tmp",needSendfileLength1,"AAEE");
//                   }






//                    //判断包长 与读取个数是否相等
//                    int eachitemSum=fileNameIndex+bufferFILENAME.length+bufferFILELENGTH.length+bufferCHECKSUM.length+(bufferCHECKSUM.length*4);
//                    int c1= (PACKAGELENGTH-readLength/2);
//                    int c2= (eachitemSum-readLength);
//                    Log.e(TAG+"=="+c1+"==",c2+"==判断包长与读取个数是否相等==");
//                    if(c1*2==c2 ){
//                        //
//                        Log.e(TAG+"=="+c1+"WWWWWWWW==",c2+"==判断包长与读取个数是否相等==");
//                    }else{
//                        //请求重发
//                    }

                    if(STSTE.equals(Download)){
                    }else if (STSTE.equals(DownloadCommandSucceed)){

                   }else if(STSTE.equals(DownloadFileSucceed)){

                   }else if(STSTE.equals(ResendCommand)){

                   }




                    outstream.close();

                }else{
                    //协议错误,帧头 帧尾不正确
                }




                outstream.close();









              //  getFinish();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        Looper.loop();
    }

    private  byte[] getWrite(String fh,String state,int packageLength,int version ,int fileType,String filename,long fileLength,String ft) throws UnsupportedEncodingException {
        byte[] writeFH=Tools.HexString2Bytes(fh);
        byte[] writeSTATE=Tools.HexString2Bytes(state);
        String  complementLength= complementEnough8Byte(packageLength);
        byte[] writePACKAGELENGTH=Tools.HexString2Bytes(complementLength);
        String complementV =complementEnough8Byte(version);
        byte[] writeVERSION=Tools.HexString2Bytes(complementV);
       String type="0"+Integer.toHexString(fileType);
        byte[] writeFILETYPE=Tools.HexString2Bytes(type);
        byte[] nameByte=Tools.str2HexStr(filename).getBytes();
        String fileName=new String(nameByte, 0, nameByte.length, "utf-8");
        Log.e(Integer.toHexString(version)+"组织文件名",""+fileName);
        byte[] writeFILNAME=Tools.HexString2Bytes(fileName);
       String complementFL= complementEnough8Byte(fileLength);
        Log.e(complementFL+"组织文件长度","=="+fileLength);
        byte[] writeFILELENGTH=Tools.HexString2Bytes("00000000"+complementFL);
        //校验和
        byte[] check1 = Utils.byteMerger(writeSTATE, writePACKAGELENGTH);
        byte[] check2 = Utils.byteMerger(check1, writeVERSION);
        byte[] check3 = Utils.byteMerger(check2, writeFILETYPE);
        byte[] check4 = Utils.byteMerger(check3,writeFILELENGTH );
        byte[] check5 = Utils.byteMerger(check4, writeFILNAME);
        long sum=0;
        for(int i=0;i<check5.length;i++){
            sum+=check5[i];
        }
        String complementSum=complementEnough4Byte(sum);
        byte[] writeSUM=Tools.HexString2Bytes(complementSum);
        Log.e("计算校验和==",complementSum+"=="+sum);
        byte[] writeFT=Tools.HexString2Bytes(ft);


        byte[] n1 = Utils.byteMerger(writeFH, writeSTATE);
        byte[] n2 = Utils.byteMerger(n1, writePACKAGELENGTH);
        byte[] n3 = Utils.byteMerger(n2, writeVERSION);
        byte[] n4 = Utils.byteMerger(n3, writeFILETYPE);
        byte[] n5 = Utils.byteMerger(n4, writeFILNAME);
        byte[] n6 = Utils.byteMerger(n5, writeFILELENGTH);
        byte[] n7 = Utils.byteMerger(n6, writeSUM);
        byte[] n8 = Utils.byteMerger(n7, writeFT);
       return n8;
    }

    private String complementEnough4Byte(long sum) {
        String version16= Long.toHexString(sum);
        String complementV="";
        switch (version16.length()){
            case 1:
                complementV="000"+version16;
                break;
            case 2:
                complementV="00"+version16;
                break;
            case 3:
                complementV="0"+version16;
                break;
            case 4:
                complementV=""+version16;
                break;
        }
        return complementV;
    }

    private String complementEnough8Byte(long number) {
        String number16= Long.toHexString(number);
        String myComplement="";
        switch (number16.length()){
            case 1:
                myComplement="0000000"+number16;
                break;
            case 2:
                myComplement="000000"+number16;
                break;
            case 3:
                myComplement="00000"+number16;
                break;
            case 4:
                myComplement="0000"+number16;
                break;
            case 5:
                myComplement="000"+number16;
                break;
            case 6:
                myComplement="00"+number16;
                break;
            case 7:
                myComplement="0"+number16;
                break;
            case 8:
                myComplement=""+number16;
                break;
        }
        return myComplement;
    }


    public void getFinish() {
        if(Socket_Activity.socket_ActivityContextList.size()>0){
            for(Activity context1:Socket_Activity.socket_ActivityContextList){
                try {
                    Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
                context1.finish();
            }
        }

    }












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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值