使用socket通信来大大缩短Java调用python程序时import导入包的时间

1.服务端

import socket
import time
print("1111111111111111")
import tensorflow as tf
from test1 import ef
# 这里写需要加载的包
print("2222222222222222")
End = 'end send'  # 这里是为了判断对应的客户端请求命令的结束标志,目的是为了接受超过1024个字符的(client)客户端请求。

def recv_end(the_socket):
    total_data = []
    while True:
        data = the_socket.recv(2048).decode('utf-8')
        if End in data:
            total_data.append(data[:data.find(End)])
            break
        total_data.append(data)
        if len(total_data) > 1:
            # check if end_of_data was split
            last_pair = total_data[-2] + total_data[-1]
            if End in last_pair:
                total_data[-2] = last_pair[:last_pair.find(End)]
                total_data.pop()
                break
    return ''.join(total_data)


HOST = ''
PORT = 57
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while 1:
    conn, addr = s.accept()
    print('Connected by', addr)
    data = recv_end(conn)
    method = data[0]
    subdata = data[1:]

    if (method == "1"):  # 当客户端传递过来的第一个字符为1时,params表示传递过来的参数
        params = subdata.split("|")

        t1 = time.time()
        # 这里写要调用的函数
        ef(tf)
        t2 = time.time()
        print("1111111111111111111")
        # AI_run(FaceRecognizer)
        print("总时间:{}ms".format((t2-t1)*1000))
        # 将结果返回给客户端
        conn.sendall((str((params[0], params[1]))).encode())
    elif (method == "2"):
        params = subdata.split("|")
        # 这里写要调用的函数
        # AI_run(FaceRecognizer)
        print("2222222222222222222222222222")

        # 将结果返回给客户端
        conn.sendall((str((params[0], params[1]))).encode())
    elif (method == "3"):
        params = subdata.split("|")
        # 这里写要调用的函数
        print("33333333333333333333333333333333")
        # AI_run(FaceRecognizer)
        # 将结果返回给客户端
        conn.sendall((str((params[0], params[1]))).encode())
    conn.close()

2.客户端

import socket
HOST = '127.0.0.1'  # The remote host
PORT = 57  # The same port as used by the server
End = 'end send'
def cl_test(test1, test2):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.sendall((str(1) + test1 + "|" + test2 + End).encode())  # str(1)表示第一个字符,然后在server端中规定字符串用|隔开
    data = []
    while True:
        subdata = s.recv(2048)  # 接受服务端返回参数
        if not subdata:
            break
        data.append(str(subdata, encoding='utf-8'))
    data = ''.join(data)
    print(data)
    s.close()
    return data  # data是服务端的返回参数

cl_test("d", "d")

3.你自己需要运行的程序,这里我是 test1.py文件。

def ef(tf):
    a = tf.constant(5.0)#tf.constant是tensorflow库中的函数
    b = tf.constant(6.0)
    print(a,b)

4.这里的通信你可以放在任何你需要执行的python代码中,相当于提前准备好库,已经导入了各种你所需要的python库后,你只需要一个客户端传来的信号就可以立刻执行,同时服务端不会断开,随时接受你传来的信号执行你所需要的程序,这就减少了你每次执行该程序时需要导入包的大量时间,一个项目的完成少不了大量的包导入,这样你的程序性能会更加高,更加具有实时行,尤其是对于在Java 中调用python进行视频智能识别的项目。

5.及时收藏,避免迷路。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧鼎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值