关于Java通过socket调用python图像识别算法使用总结
1、业务背景
我们需要实现一个在java中获取数据库的图片并调用python图像识别算法对图片进行相应识别,然后将识别后的图片返回并存储的功能。
2、socket是啥?
socket是用户进程与Tcp/Ip协议的中间人,即位于应用层与传输层之间。
3、为什么要使用socket?
由于java无法直接调用python编写的接口,因此可以通过socket实现java客户端与python服务端间的通信
4、java客户端使用socket基本流程
try { socket = new Socket(HOST, PORT); // 2、获取输出流对象 System.out.println("准备发送数据。。。"); writer = new PrintWriter(socket.getOutputStream()); // 3、发送json数据 writer.print(jsonObject); writer.flush(); //传送json结束 // 4、开始发送图片 InputStream fis = new ByteArrayInputStream(picturedata); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); BufferedImage bi; try { bi = ImageIO.read(fis); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bi,"jpg",baos); byte[] bytes = baos.toByteArray(); byte[] sendBytes = new byte[1024]; int count = bytes.length/1024 + 1; for (int i = 0; i < count; i++) { sendBytes = new byte[1024]; if (i == count-1){ System.arraycopy(bytes,1024*i,sendBytes,0,bytes.length%1024); dos.write(sendBytes); }else { System.arraycopy(bytes,1024*i,sendBytes,0,1024); dos.write(sendBytes); } } }catch (Exception e){ e.printStackTrace(); } // 发送图片结束 System.out.println("发送成功。"); // 5、获取服务进程的输入流 System.out.println("开始接收json数据。。。"); br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8")); char[] rDataLen = new char[100]; br.read(rDataLen, 0, 100); String response = new String(rDataLen); JSONObject array = JSONObject.parseObject(response.trim()); System.out.println("开始接收图片。。。"); DataInputStream dis = new DataInputStream(socket.getInputStream()); int imageSize = Integer.parseInt(jsonObject.get("file_size").toString()); byte[] buff = new byte[imageSize];for (int i = 0; i < imageSize; i++) { dis.read(buff,i,1); } System.out.println("接收图片结束"); } catch (Exception e) { e.printStackTrace(); }finally { try { if(socket!=null) { socket.close(); } }catch (IOException e) { e.printStackTrace(); } System.out.println("远程接口调用结束."); }