天天看點

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);

   }

}

繼續閱讀