【发布时间】:2021-07-27 11:44:44
【问题描述】:
我正在尝试让它在两台计算机之间发送视频流。 我的代码似乎可以在本地工作,但不能在单独的机器上工作? 我不知道为什么它不起作用可能是我从服务器端发送数据?
我试过这个,但我似乎有帮助: Unable To Connect Python Sockets On Different Computers
服务器代码:
import cv2
import numpy as np
import socket
import sys
import pickle
import struct
import os
hostname = socket.gethostname()
HOST = socket.gethostbyname(hostname)
PORT = 8089
while True:
try:
while True:
os.system('cls')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST, PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn, addr = s.accept()
print("Connected")
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
# Serialize frame
data = pickle.dumps(frame)
# Send message length first
message_size = struct.pack("L", len(data)) ### CHANGED
# Then data
conn.sendall(message_size + data)
except:
print("RESETING CONNECTION")
客户代码:
import pickle
import socket
import struct
import cv2
host = input("ROBOT IP:")
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect((host, 8089))
data = b'' ### CHANGED
payload_size = struct.calcsize("L") ### CHANGED
while True:
# Retrieve message size
while len(data) < payload_size:
data += clientsocket.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED
# Retrieve all data based on message size
while len(data) < msg_size:
data += clientsocket.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
# Display
cv2.imshow('frame', frame)
cv2.waitKey(1)
错误信息: TimeoutError: [WinError 10060] 连接尝试失败,因为连接的一方在一段时间后没有正确响应,或者连接的主机没有响应,建立连接失败
请帮忙
【问题讨论】:
-
什么是“不工作”?会发生什么,应该发生什么(编辑问题以解释并显示错误消息(如果存在))?
-
您是否打印了
HOST值以确保您不会意外获得环回地址127.0.0.1?您可能只想绑定到0.0.0.0,以便获得所有接口。 -
这两台机器都在您的网络中吗?您可以从本地计算机 ping 服务器吗?
-
@TimRoberts 它以 192.168 号码响应,我认为绑定到 0.0.0.0 会像 localhost?两台机器都在同一个网络上。
-
不,127.0.0.1 是本地主机。 “0.0.0.0”表示“我想在所有接口上收听。”