天天看点

socket监听端口读取端口信息

import java.io.BufferedInputStream;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Arrays;

public class ListenPort extends ServerSocket {

   //入口地磁第一次接收到的车辆个数

int inNumF =0;

//入口地磁第二次接收到的车辆个数

int inNumS = 0;

//出口地磁第一次接收到的车辆个数

int outNumF = 0;

//出口地磁第二次接受到的车辆个数

int outNumS = 0;

private String data1;

    //把获取的16进制数组转换为字符串

    private static final String HEX_CODE = "0123456789ABCDEF";

    public static String byteArrayToHexString(byte[] bs) {

        int _byteLen = bs.length;

        StringBuilder _result = new StringBuilder(_byteLen * 2);

        for (int i = 0; i < _byteLen; i++) {

            int n = bs[i] & 0xFF;

            _result.append(HEX_CODE.charAt(n >> 4));

            _result.append(HEX_CODE.charAt(n & 0x0F));

        }

        return String.valueOf(_result);

    }

    class ServerThread extends Thread {

    private Socket socket;

        public ServerThread(Socket s) throws IOException {

            this.socket = s;         

            start();

        }

        //根据地磁编号获取当前地磁的车辆计数

        public  int getCarNum(String diCiNum){

        String Info =  data1.substring(data1.indexOf(diCiNum),data1.indexOf(diCiNum)+16);

        String carNum = Info.substring(14,16);

        int number = Integer.parseInt(carNum, 16);

        return number;

        }

    public void run(){

        try {

while(true){

BufferedInputStream bis=new BufferedInputStream(socket.getInputStream());

byte[] data = new byte[1024];

int len = bis.read(data);

if(len>0){

data1 = byteArrayToHexString(Arrays.copyOf(data, len));

if(data1.contains("17E8")||data1.contains("17F0")){

   inNumS = this.getCarNum("17E8");

   outNumS  =  this.getCarNum("17F0");

   System.out.println("=inNumS="+inNumS+"=outNumS="+outNumS+"=inNumF="+inNumF+"=outNumF="+outNumF);

  if(inNumF > inNumS && outNumF<outNumS){

    getParking.inCarNumber= 255-inNumF+outNumS+1;

    getParking.outCarNumber = outNumS - outNumF;

   }else if(inNumF > inNumS && outNumF>outNumS){

    getParking.inCarNumber= 255-inNumF+outNumS+1;

    getParking.outCarNumber = 255 -outNumF + outNumS+1 ;

   }else if(inNumF < inNumS && outNumF>outNumS){

    getParking.inCarNumber= inNumS - inNumF;

    getParking.outCarNumber = 255 - outNumF+outNumS+1;

   }else{

       getParking.inCarNumber= inNumS - inNumF;

       getParking.outCarNumber = outNumS - outNumF;

      }

getParking.parkCarNum = getParking.parkCarNum- getParking.inCarNumber + getParking.outCarNumber;

     inNumF = inNumS;

     outNumF = outNumS;

     System.out.println("=inNumF="+inNumF+"=inNumS="+inNumS+"=outNumF="+outNumF+"=outNumS="+outNumS);

System.out.println(data1+"===地磁信息==="+getParking.inCarNumber+"===="+getParking.outCarNumber);

 }

}

   }

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

   }

    }

   public ListenPort(int serverPort) throws IOException, InterruptedException {

        // 用指定的端口构造一个ServerSocket

  super(serverPort);

        try {

            while (true) {

            System.out.println("开始监听端口");

                // 监听一端口,等待客户接入

                Socket socket = accept();

                // 将会话交给线程处理

                new   ServerThread(socket);

           }

        }

         catch (Exception e) {

            e.printStackTrace();

        } finally{

        close();

        }

   }

   public static void main(String args[]) throws Exception{

  new ListenPort(7654);

   }

}