最近在做刷卡机设备对接,涉及报文传送。刷卡机为客户端,自己写服务端。
上代码(服务端):
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;
}