pom文件导入:
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
流程:
ServerSocket监听指定端口 ——> 客户端发起请求 ——> ServerSocket拦截到Socket ——> 解析请求 ——> 返回结果
服务类:
public class SocketImpl {
private ServerSocket serverSocket;
private Socket socket;
public SocketImpl(Integer port){
try {
serverSocket = new ServerSocket(port);//创建ServerSocket实例指定监听端口
System.out.println("服务已启动......");
} catch (IOException e) {
System.err.println("IO错误");
}
}
public void start(){
try {
while (true){
//服务不能断开,一直等待客户端发请求
socket = serverSocket.accept();
//等到客户端发请求就开一个回复线程处理请求
SocketThread socketThread = new SocketThread(socket);
new Thread(socketThread).start();
}
} catch (IOException e) {
System.err.println("IO错误");
}
}
}
解析请求、回复类:
class SocketThread extends Thread{
Socket socket;
public SocketThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
OutputStream outputStream = null;
OutputStreamWriter outputStreamWriter = null;
InputStreamReader inputStreamReader = null;
try {
//获得输出流
outputStream = socket.getOutputStream();
outputStreamWriter = new OutputStreamWriter(outputStream);
//获得输入流
inputStreamReader = new InputStreamReader(socket.getInputStream());
StringBuffer stringBuffer = new StringBuffer();
char[] chars = new char[1024];
int len = inputStreamReader.read(chars);
//获取请求信息
stringBuffer.append(new String(chars,0,len));
//解析请求资源
String path = stringBuffer.substring(stringBuffer.indexOf("/") + 1, stringBuffer.indexOf(" HTTP/1.1")) ;
Map map = null ;
//有参数就解析参数
if (path.indexOf("?")!=-1){
map = new HashMap();
String param = path.substring(path.indexOf("?") + 1);
path = stringBuffer.substring(stringBuffer.indexOf("/") + 1, stringBuffer.indexOf("?"));
String[] split = param.split("&");
for (String s : split) {
String[] split1 = s.split("=");
map.put(split1[0], URLDecoder.decode(split1[1],"utf-8"));
}
}
//判断请求的资源
if ("codeImage".equals(path)){
if (map != null){//有参返回
outputStream.write(Result.getCodeImage((String) map.get("content")));
}else//默认返回
outputStream.write(Result.getCodeImage("http://hxb19990523.top:8080/HTML/index.html"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
outputStreamWriter.close();
outputStream.close();
inputStreamReader.close();
} catch (IOException e) {
System.err.println("IO错误");
}
}
}
}
结果类:
class Result{
/**
* 获取二维码
* @return byte[]
* @throws Exception
*/
public static byte[] getCodeImage(String content) throws Exception {
QRCodeWriter qrCodeWriter=new QRCodeWriter();
BitMatrix bitMatrix=qrCodeWriter.encode(content, BarcodeFormat.QR_CODE,350,350);
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix,"PNG",byteArrayOutputStream);
byte[] image = byteArrayOutputStream.toByteArray();
return image;
}
}
测试类:
public class MainTest {
public static void main(String[] args) {
new SocketImpl(80).start();//指定端口并启动服务
}
}
开启服务测试一波
无参请求信息
返回二维码
有参请求信息
返回二维码
直接CV就能使用