【问题标题】:Socket works when both scripts are on the same machine but not on separate当两个脚本在同一台机器上但不在单独的机器上时,套接字工作
【发布时间】: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”表示“我想在所有接口上收听。”

标签: python sockets


【解决方案1】:

确定

hostname = socket.gethostname()
HOST = socket.gethostbyname(hostname)

正在为您的设备生成正确的 IP 地址。我建议您打印出主机地址是什么,并确保它与您的实际 wlan 或 eth0 端口 IP 地址的 IP 地址相对应。

您可以通过多种方式检查您的设备 IP 地址,如果您使用 Linux 或 Windows,它会有所不同。通常,它的命令是 ifconfig 或 ipconfig。

我不得不做同样的事情。我的解决方案是将我的设备 IP 地址设置为静态,然后将 IP 地址硬编码到代码中。但我的情况可能与你不同。

【讨论】:

  • 它给正确的 IP 一个 192.168 号码。
  • 你是不是先启动服务端代码再启动客户端代码?
  • 我确实在客户端之前启动了服务器
  • 你在什么样的网络上尝试这个?这是您共享互联网的公寓吗?还是这是学校的互联网?
  • 它只是一个普通的家庭互联网,有一个静态 ip。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 2021-10-22
相关资源
最近更新 更多