-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsocketNumpy.py
More file actions
99 lines (82 loc) · 3.17 KB
/
socketNumpy.py
File metadata and controls
99 lines (82 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import socket
import numpy as np
import pickle
import struct
class SocketClient:
def __init__(self, address, port):
self.address = address
self.port = port
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.type = "client"
def connect(self):
self.socket.connect((self.address, self.port))
def send_numpy_array(self, np_array):
data = pickle.dumps(np_array)
# Send message length first
message_size = struct.pack("i", len(data))
# Then data
self.socket.sendall(message_size + data)
def receive_array(self):
self.payload_size = struct.calcsize("i")
self.data = b""
while len(self.data) < self.payload_size:
self.data += self.socket.recv(self.payload_size)
packed_msg_size = self.data[: self.payload_size]
self.data = self.data[self.payload_size :]
msg_size = struct.unpack("i", packed_msg_size)[0]
# Retrieve all data based on message size
while len(self.data) < msg_size:
self.data += self.socket.recv(min(4096, msg_size - len(self.data)))
frame_data = self.data[:msg_size]
self.data = self.data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
return frame
def send_close_notice(self):
# Send message length first
message_size = struct.pack("i", 0)
# Then data
self.socket.sendall(message_size)
def close(self):
self.socket.close()
class SocketServer:
def __init__(self, address, port):
self.address = address
self.port = port
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.type = None # server or client
def bind_listen_and_accept(self):
self.address = self.address
self.port = self.port
self.socket.bind((self.address, self.port))
print("Socket bind complete.\n OK Run Client Program OK")
self.socket.listen(10)
self.conn, addr = self.socket.accept()
print("Socket now listening")
self.payload_size = struct.calcsize("i")
self.data = b""
def send_numpy_array(self, np_array):
data = pickle.dumps(np_array)
# Send message length first
message_size = struct.pack("i", len(data))
# Then data
self.conn.sendall(message_size + data)
def receive_array(self):
while len(self.data) < self.payload_size:
self.data += self.conn.recv(self.payload_size)
packed_msg_size = self.data[: self.payload_size]
self.data = self.data[self.payload_size :]
msg_size = struct.unpack("i", packed_msg_size)[0]
if msg_size == 0:
raise ("0 len received, close socket")
# Retrieve all data based on message size
while len(self.data) < msg_size:
self.data += self.conn.recv(min(4096, msg_size))
frame_data = self.data[:msg_size]
self.data = self.data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
return frame
def close(self):
self.conn.close()