java与python通信——使用socket模块
前几天遇到个问题需要用python和java通信,网上这种帖子很多,比如runtime方法,py4j方法等。
但是runtime方法似乎只能向python传参,不能接受python传回;
py4j看了半天没理解。
最后python选择了socket模块,java那边选择了一个插件(hutool)
import socket
IP = '' # 主机地址为空字符串,表示绑定本机所有网络接口ip地址
PORT = 4000 # 端口号,java那边也要保持一致
BUFLEN = 4048 # 缓冲区大小,定义一次从socket缓冲区最多读入4048个字节数据,可以不和java那边定义的一致
# 创建socket对象,同时设置通信模式,AF_INET代表IPv4,SOCK_STREAM代表流式socket,使用的是tcp协议
listenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到我们刚刚设置的ip和端口元组,代表我们的服务运行在本机的PORT端口上
# 在构建socket的时候需要用到ip和端口,必须是元组的形式。
# 另外,因为是本机上的两个程序通信,所以设置成localhost,
# 如果要和网络上的其他主机进行通信,则填上相应主机的ip地址,端口的话随便设置一个,不要和已知的一些服务冲突就行
listenSocket.bind((IP, PORT))
# 开始监听,5位最大挂起的连接数
listenSocket.listen(5)
# accept()方法被动接受客户端连接,阻塞,等待连接. client是客户端的socket对象,可以实现消息的接收和发送,addr表示客户端的地址
client, addr = listenSocket.accept()
print('接受一个客户端连接:', addr)
def dispacher(info="itemCF,1,10"):
"""
接受的字符串信息,判断是哪种类型,分发给不同函数
:param info: 传过来的信息
:return:
"""
# info和下面的都是我自己用于推荐系统的,你需要换成你自己的
info_list = info.split(',')
print(info_list)
if info_list[0] == "itemCF":
return itemCF_prediect(iid=int(info_list[1]), n=int(info_list[2]))
if info_list[0] == "userCF":
return userCF_prediect(uid=int(info_list[1]), n=int(info_list[2]))
if info_list[0] == "lfm":
return lfm_prediect(uid=int(info_list[1]), n=int(info_list[2]))
# 无限循环,实现反复接收请求
while True:
# 尝试读取对方发送的消息
# BUFLEN 指定从接收缓冲里最多读取多少字节
recev = client.recv(BUFLEN) # 代表从发过来的数据中读取BUFLEN大小byte类型的数据
# 如果返回空bytes,表示对方关闭了连接
# 退出循环,结束消息收发
if not recev:
break
# 读取的字节数据是bytes类型,需要解码为字符串
info = recev.decode()
print(f"收到:{info}")
# 发送消息给客户端,发送的消息必须是byte类型
client.sendall(str(dispacher(info=info)).encode()) # encode() 用于将 str 类型转换成 bytes 类型
client.close() # 关闭连接
listenSocket.close()
我的任务:java给python传递3个参数a,b,c;python给java传回一个列表(不定长)
因为socket通信试了一些传递bytes数组的方法均失败(不是乱码就是长度不够),所以索性先转为str,再转为bytes类型。
java发送"a,b,c",python接受后,params_list = str.split(',')再a,b,c = params_list[0], params_list[1], params_list[2]
python给发送如"[1,2,3]",java接受后,将字符串再处理为数组即可
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_43469047/article/details/123116258