使用socket通信,java调用python预测算法

项目需求

我们的项目主要是做到前端上传文件,后端解析文件,把解析出的值给python运用深度学习的预测算法,预测出结果返给前端页面展示。
项目运行行环境
前端使用vue
后端使用Spring、SpringMVC、Mybatis
算法使用tensorflow2.0,python语言。
本文目的
本文主要讲解如何用java调用python程序,并把测试集的输出,即预测结果返回给java后端。
主要使用了socket通信,并没有使用主流的pb模型什么。跨语言使用socket调用十分方便,通过IP和端口号监听、输出、接收特别神奇!就是服务器与客户端之间的通信模式,只靠IP与端口号进行通信,不用考虑跨语言问题,不用考虑与服务器上配置的跑预测模型的环境问题

1.定IP和端口号

java里写的一定要和python里写的一致,这样才能监听端口。

	//java服务器端
	//给socket通信制定IP和端口号
    private static final String IP = "10.5.45.133";
    private static final int PORT = 8080;
    //开始用socket通信来调用python算法
        try {
            //绑定与python相同的端口号和IP
            Socket socket = new Socket(IP, PORT);
            System.out.println(socket);
      

2.java向客户端(python)发送消息

此处OutputStream为输出流,需要发送给客户端的消息可以通过.write()传送。
receive为需要给客户端发送的内容。但是如果传输的内容为字符串型,必须通过.getBytes()转成字节流才能发送。

		java服务器端,输出
        //给python传输数据,服务器端向客户端发送os消息
        OutputStream os = socket.getOutputStream();//字节输出流
        //把String转成字节传送,必须要写
        os.write(receive.getBytes());
        //将输出流包装为打印流
        PrintWriter pw = new PrintWriter(os);//字符输出流
        //pw.write(String.valueOf(info));
        pw.flush();
        //关闭输出流
        socket.shutdownOutput();

3.python客户端收到消息解析

(1)定ip和端口号,一定和服务器端(java)保持一致
	//python客户端
	# 1创建socket套接字
      tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2绑定本地信息
      tcp_server_socket.bind(("10.5.45.133", 8080))
    # 3让套接字从主动变为监听
      tcp_server_socket.listen(128)
    # 4等待客户端连接accent
      client_socket, client_Addr = tcp_server_socket.accept()
(2)python客户端解析java服务器端发来的消息
	//python客户端
	 while True:
            recv_data = client_socket.recv(1024)
            if not recv_data:
                break
            else:
                data = data + recv_data

        # 将接收数据解码
        jreceive = data.decode()
(3)python客户端向java服务器端发送预测出的结果

此处的information为接收到python客户端的信息,和python客户端psend中保存的信息是一致的。

	//python客户端
	# 此处写测试算法即可,即需要调用的python函数
	if __name__ == "__main__":
    main()
    # 将发送数据编码并回复
    client_socket.sendall(psend.encode("utf-8"))

4.java服务器端接收python客户端的预测结果

此处的information为接收到python客户端的信息,和python客户端psend中保存的信息是一致的。

	//输入
	//获取输入流,接收来自python的信息
	InputStream is = socket.getInputStream();
	 BufferedReader in = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
	//对输入流做解析,information为接收到Python的数据
	String information=null;
	 while ((information = in.readLine()) != null) {
          message += information;
	}

此时java客户端就可以接收打印python服务器端发送来的消息了!
使用socket通信好处在于,前端什么时候给后端发请求,后端什么时候调用python的算法,但是python的socket默认是预测一次就自动关闭。简单点的处理方法应该是可以用定时器,反复绑定socket通信。我具体还没有尝试,大家有好的办法也可以告诉我哦。
刚入门的小白,写的不足之处请多多指教,欢迎与我沟通交流!!!

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值