最近在做刷卡機設備對接,涉及報文傳送。刷卡機爲客戶端,自己寫服務端。
上代碼(服務端):
public void run(){
InputStream is = null;
OutputStream os = null;
PrintWriter pw = null;
String toMidStr="";
try{
is = socket.getInputStream(); // //獲取一個輸入流,並讀取客戶端的信息
BufferedInputStream bis = new BufferedInputStream(is); // 流存放緩衝區
DataInputStream dis = new DataInputStream(bis);
byte[] bytes = new byte[1]; // 一次讀取一個byte
String ret = "";
while (dis.read(bytes) != -1) { //此處是按照字節來讀取,網上bufferreader readLine也可以,根據自己情況而定。
ret += BWUtil.bytesToHexString(bytes) + " "; //調用字節轉化16進制字符串方法
if (dis.available() == 0) { //此處如果dis.available()爲零了就是讀取完畢了
System.out.println("收到報文數據: " + ret);
toMidStr = BWUtil.bwToMid(ret);
//System.out.println("上位機返回報文:"+toMidStr);
ret = "";
break;//此處要跳出,否則一直處於讀取等待中
}
}
socket.shutdownInput();//關閉輸入流
//獲取輸出流,響應客戶端的請求
os = socket.getOutputStream();
//包裝爲打印流
os.write(BWUtil.str2HexByte(toMidStr));//此處BWUtil.str2HexByte(toMidStr)方法把字符串直接轉化爲byte數組輸出,不再進行來回轉化,否則大於0x80的轉換成char會有問題,此處耽誤時間較長。。。
os.flush();//將緩存輸出
socket.shutdownOutput();
}catch(IOException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try{
if(os != null)
os.close();
if(is != null)
is.close();
if(socket != null)
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
字符串轉數組處理方法:很感謝網友的貢獻。感謝同仁無私分享。
public static byte[] str2HexByte(String data) {
if(1==data.length()%2)
return null;
else{
byte[] li = new byte[data.length()/2];
for (int i = 0; i < data.length(); i+=2) {
int cp1 = data.codePointAt(i);
int cp2 = data.codePointAt(i+1);
li[i/2] = (byte)(asc2Hex(cp1)<<4|asc2Hex(cp2));
}
return li;
}
}
public static int asc2Hex(int data){
int li;
if(data >= 0X30 && data <= 0X39){//0-9
li = data - 0X30;
}else if (data >= 0X41 && data <= 0X5A){//A-F
li = data - 0X37;
}else if(data >= 0X61 && data <= 0X7A){//a-f
li = data - 0X57;
}else{
li = data;
}
return li;
}