关于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("远程接口调用结束.");
            }

 

posted @ 2020-12-03 11:28  xlfdy  阅读(757)  评论(0编辑  收藏  举报