1+ import socket
2+ #import threading
3+ import bpy
4+ import select
5+
6+ from .Utils import BEUtils
7+ from . import BESettings , BERunNodes
8+
9+ import json
10+ import pickle
11+
12+ # MAX_BYTES = 4096
13+ # host = socket.gethostname() # get name of local machine
14+ # host = '10.0.0.5'
15+ # port = 55555
16+
17+ SERVER_SOCKET = None
18+
19+
20+ def handle_client (client_socket , addr ):
21+ print ('handle client' )
22+
23+ # global SERVER_SOCKET
24+
25+ be_paths = BESettings .START_PARAMS
26+
27+ while True :
28+ if select .select ([client_socket ], [], [], 0.01 )[0 ]:
29+ bpy .ops .wm .read_homefile (use_empty = True )
30+
31+ context = bpy .context
32+
33+ window = context .window_manager .windows [0 ]
34+ with context .temp_override (window = window ):
35+
36+ # Receive
37+ js_base_stuff_bytes = RecvAll (client_socket , be_paths .buffer_size )
38+ # js_base_stuff = js_base_stuff_bytes.decode()
39+ js_base_stuff = json .loads (js_base_stuff_bytes )
40+
41+ be_base_stuff = BEUtils .BaseStuff (js_base_stuff ["BaseValues" ])
42+
43+ process_gn_obj , geom_mod , node_tree = BEUtils .LoadNodesTreeFromJSON (context , be_paths , be_base_stuff )
44+
45+ if be_base_stuff .run_type == BESettings .RunNodesType .RunNodes :
46+ js_inputs = js_base_stuff ["BEngineInputs" ]
47+ js_output_data = BERunNodes .RunNodes (context , be_paths , js_inputs , node_tree ,
48+ process_gn_obj , geom_mod , be_base_stuff )
49+
50+ # Send
51+ if js_output_data :
52+ # SendAll(client_socket, str.encode(json.dumps(js_output_data)))
53+ client_socket .sendall (str .encode (json .dumps (js_output_data )))
54+
55+ elif be_base_stuff .run_type == BESettings .RunNodesType .UpdateNodes :
56+ BERunNodes .SaveBlenderInputs (be_base_stuff , node_tree )
57+
58+
59+ AddBackServer (0.01 )
60+
61+ client_socket .close ()
62+
63+ print ("Closing connection with %s" % str (addr ))
64+ # client_socket.close()
65+ # client_sockets.remove(client_socket)
66+
67+ break
68+
69+
70+ def background_server ():
71+ if select .select ([SERVER_SOCKET ], [], [], 0.01 )[0 ]:
72+ client_socket , addr = SERVER_SOCKET .accept ()
73+ print ("Got a connection from %s" % str (addr ))
74+ # client_sockets.append(client_socket)
75+
76+ # client_thread = threading.Thread(target=handle_client, args=(client_socket, addr))
77+ # client_thread.start()
78+ handle_client (client_socket , addr )
79+
80+ # bpy.app.timers.register(1.0)
81+
82+ return 0.1
83+
84+
85+ def RunServer ():
86+ global SERVER_SOCKET
87+
88+ SERVER_SOCKET = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
89+ SERVER_SOCKET .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
90+
91+ SERVER_SOCKET .bind ((BESettings .START_PARAMS .host , BESettings .START_PARAMS .port ))
92+ SERVER_SOCKET .listen (1 )
93+
94+ #client_sockets = []
95+
96+ AddBackServer (0 )
97+
98+ print ('Server has started!' )
99+
100+
101+ def AddBackServer (first_interval_int ):
102+ if not bpy .app .timers .is_registered (background_server ):
103+ bpy .app .timers .register (background_server , first_interval = first_interval_int )
104+ # bpy.app.timers.register(background_server)
105+
106+
107+ # def SendAll(sock, msg):
108+ # # totalsent = 0
109+
110+ # # while totalsent < len(msg):
111+ # # sent = sock.send(msg[totalsent:])
112+
113+ # # if sent == 0:
114+ # # raise RuntimeError("socket connection broken")
115+ # # totalsent = totalsent + sent
116+ # sock.sendall(msg)
117+
118+
119+ def RecvAll (sock , buff_size ):
120+ data = b''
121+
122+ while True :
123+ part = sock .recv (buff_size )
124+
125+ if not part :
126+ break
127+
128+ data += part
129+
130+ if len (part ) < buff_size :
131+ # either 0 or end of data
132+ break
133+
134+ return data
0 commit comments