Java实现轻量型Web服务器接收http协议提交的RFID读卡信息 |
|||
发布者:广州荣士电子有限公司 发布时间: 2023-8-9 | |||
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class httpserver {
public static void main(String[] args) throws Exception{
int listenport=80; /*监听端口号*/
if (args[0]!=null){listenport=Integer.parseInt(args[0]);} //侦听自定义的端口
try {
ServerSocket ss = new ServerSocket(listenport);
while (true) {
String condition="";
String ResponseStr="";
Socket socket = ss.accept(); /*实例化客户端,固定套路,通过服务端接受的对象,生成相应的客户端实例*/
BufferedReader bd = new BufferedReader(new InputStreamReader(socket.getInputStream())); /*获取客户端输入流,就是请求过来的基本信息:请求头,换行符,请求体*/
String requestHeader;
int contentLength = 0;
while ((requestHeader = bd.readLine()) != null && !requestHeader.isEmpty()) { /*** 接受HTTP请求,并解析数据 */
System.out.println(requestHeader);
/*** 获得GET参数*/
if (requestHeader.startsWith("GET")) {
int begin = requestHeader.indexOf("?") + 1;
int end = requestHeader.indexOf("HTTP/");
condition = requestHeader.substring(begin, end);
ResponseStr=AnalyticHttpInfo(condition); //解析读卡器上传的包序号、卡号、机号等信息,并生成回应字符串
}
else {
/*** 获得POST参数* 1.获取请求内容长度*/
if (requestHeader.startsWith("Content-Length")) {
int begin = requestHeader.indexOf("Content-Lengh:") + "Content-Length:".length();
String postParamterLength = requestHeader.substring(begin + 1).trim();
contentLength = Integer.parseInt(postParamterLength);
}
}
}
StringBuffer sb = new StringBuffer();
if (contentLength > 0) {
for (int i = 0; i < contentLength; i++) {
sb.append((char) bd.read());
}
System.out.println("POST parameter: " + sb.toString());
condition=sb.toString().replace("\r\n","");
condition=condition.replace("{",""); //可以引用JSON的Jar包来解析json数据,这里将它转一般字符串来处理
condition=condition.replace("}","");
condition=condition.replace(",","&");
condition=condition.replace(":","=");
condition=condition.replace("\"","");
ResponseStr=AnalyticHttpInfo(condition); //解析读卡器上传的包序号、卡号、机号等信息,并生成回应字符串
}
/*发送回应信息*/
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println(ResponseStr);
pw.flush();
System.out.println("Response: "+ResponseStr+"\r\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
/*-解析读卡器上传的包序号、机号、卡类型、卡号、卡内数据、设备序列号、读卡状态 等信息,并生成回应字符串------------------------------*/
static String AnalyticHttpInfo(String inputstr) throws Exception{
String info="";
String jihao="";
String cardtype="";
String card="";
String data="";
String dn="";
String status="";
String[] strArr = inputstr.split("&");
for (int i=0;i<strArr.length;i++){
String[] strPara= strArr[i].split("=");
switch(strPara[0]){
case "info":
info=strPara[1]; //接收到的数据包号,回应时要带入该包号才能正确回应
break;
case "jihao":
jihao=strPara[1]; //设备机号(可自编)
break;
case "cardtype":
cardtype=strPara[1]; //卡类型,1为ID卡,2为HID卡,3为T5557卡,4为EM4305卡,5为IC卡,6为二代证,7为15693卡,8为hid iclass卡
break;
case "card":
card=strPara[1]; //接收到的原始16进制卡号,可根据需要自行转换成其他卡号
break;
case "data":
data=strPara[1]; //读取卡片扇区内容
break;
case "dn":
dn=strPara[1]; //设备硬件序列号,出厂时已固化,全球唯一
break;
case "status":
status=strPara[1]; //读卡状态,如密码认证失败为12
break;
}
}
//Response=1 是指定的回应头信息+接收到的包序号+发送到读卡器的显示文字,注意中文一定要转换编码,{}的文字可以着重显示+显示延时秒数+蜂鸣响声代码+固定组合语音代码
return "Response=1,"+info+",{"+GetChineseCode("卡号")+":}"+(card+" ").substring(0,12)+GetSysDT()+",20,2,0";
}
/*取电脑系统日期时间-------------------------------------------------------------------------------------------------*/
static String GetSysDT() {
Date date=new Date();
SimpleDateFormat formatter=new SimpleDateFormat("yy-MM-dd HH:mm:ss");
String TimeStr=formatter.format(date);
return TimeStr;
}
/*获取中文编码信息----------------------------------------------------------------------------------------------*/
static String GetChineseCode(String inputstr) throws Exception{
byte[] Chinesecodearry = inputstr.getBytes("gb2312");
int codelen=Chinesecodearry.length;
String hexcode="";
for (int i=0;i<codelen;i++) {
if (i % 2 == 0) {hexcode=hexcode+"\\x";}
String bytestr="00"+Integer.toHexString(Chinesecodearry[i] & 0xff);
hexcode=hexcode+ bytestr.substring(bytestr.length() -2,bytestr.length());
}
return hexcode;
}
}
|
|||
上一篇:Python 双门双向门禁控制板实时监控源码 | 下一篇:轻松读写NDEF标签 | ||