我想获取用户按下的键盘数据并将其发送到服务器。我的服务器用于实时摄像头,但是在客户端,我无法使用while循环使用Listener。当我运行时客户端中的程序,摄像头正在运行,但是键盘监听器不起作用。我如何一起使用它们?
#client
import socket
import cv2
import numpy as np
from pynput.keyboard import Listener
PI_IP = "192.168.1.33"
streamPort = 8080
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((PI_IP, streamPort))
client_socket.settimeout(5)
client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)
rfile = client_socket.makefile('rb')
stream_bytes = b' '
def sendSocket(key):
keyData = str(key)
print("Pressed: " + keyData)
client_socket.send(keyData.encode())
print("pressed:",keyData)
data = client_socket.recv(1024).decode()
print('Received from server: ' + data)
while True:
stream_bytes += rfile.read(1024)
if len(stream_bytes) == 0:
break
first = stream_bytes.find(b'\xff\xd8')
last = stream_bytes.find(b'\xff\xd9')
if first != -1 and last != -1:
jpg = stream_bytes[first:last + 2]
stream_bytes = stream_bytes[last + 2:]
image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
cv2.imshow('image', image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
rfile.close()
client_socket.close()
with Listener(on_press=sendSocket) as l:
l.join()
#server
import io, struct
import picamera
import socket
streamPort = 8080
with picamera.PiCamera() as camera:
stream = io.BytesIO()
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_socket.bind(("192.168.1.33",streamPort))
server_socket.listen(2)
while True:
client_conn, client_address = server_socket.accept()
connection = client_conn.makefile('wb')
for _ in camera.capture_continuous(stream, "jpeg", use_video_port = True):
try:
connection.write(struct.pack('<L', stream.tell()))
connection.flush()
stream.seek(0)
connection.write(stream.read())
stream.seek(0)
stream.truncate()
except:
break
data = client_conn.recv(1024).decode()
print("from connected user: " + str(data))
conn.send(data.encode())
connection.close()
server_socket.close()