使用socket通信,java调用python预测算法
使用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通信。我具体还没有尝试,大家有好的办法也可以告诉我哦。
刚入门的小白,写的不足之处请多多指教,欢迎与我沟通交流!!!
下一篇: activemq多群负载均衡