一、描述:
通过blender的脚本,接收socket请求,将socket请求的语句,描述成blender的建模语句,通过exec()函数执行。
二、问题:
运行脚本后,blender界面无法操作。
比如程序中每隔1S添加一个不同位置的棱角球。但是在实际运行过程中,一个小球都没有显示出来。当我想通过blender界面查看时,直接卡死在运行脚本前的界面。
解决方法其实也很简单,就是将脚本单开一个线程。
python
thread = threading.Thread(target=create_server)
thread.start()
三、最终代码:
python
import bpy
import socket
import math
import threading
def create_server(host="127.0.0.1", port=55567):
# 创建一个 socket 对象
# AF_INET 表示使用 IPv4 地址
# SOCK_STREAM 表示使用 TCP 协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到指定的地址和端口
server_socket.bind((host, port))
# 开始监听客户端的连接请求
# 参数 5 表示最大连接数(队列长度)
server_socket.listen(1)
print(f"Server is listening on {host}:{port}...")
try:
while True:
# 等待客户端连接
client_socket, client_address = server_socket.accept()
print(f"Connection from {client_address}")
client_socket.sendall(b"Hello from server!")
client_socket.setblocking(False)
while True:
try:
# 接收客户端发送的数据
data = client_socket.recv(1024) # 每次接收最多 1024 字节
if data:
str = data.decode('utf-8')
print(f"Received from client: {str}")
# 向客户端发送响应
exec(str)
else:
print("No data received from client.")
break
except BlockingIOError:
#print("BlockingIOError")
i = 0
# 关闭客户端连接
client_socket.close()
print(f"Connection with {client_address} closed.")
except KeyboardInterrupt:
print("Server is shutting down.")
finally:
# 关闭服务器 socket
server_socket.close()
print("Server socket closed.")
if __name__ == "__main__":
thread = threading.Thread(target=create_server)
thread.start()
#create_server()