2016-04-08 35 views
5

我一直在试图从我的客户(树莓派)发送实时视频帧托管于笔记本电脑的服务器。这两个设备都连接到同一个网络。使用OpenCV的插座发送视频通过TCP在树莓派

Server.py

import socket 
import sys 
import cv2 
import pickle 
import numpy as np 
import struct 

HOST = '192.168.1.3' 
PORT = 8083 

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() 

data = "" 
payload_size = struct.calcsize("L") 

while True: 
    while len(data) < payload_size: 
     data += conn.recv(4096) 
    packed_msg_size = data[:payload_size] 

    data = data[payload_size:] 
    msg_size = struct.unpack("L", packed_msg_size)[0] 

    while len(data) < msg_size: 
     data += conn.recv(4096) 
    frame_data = data[:msg_size] 
    data = data[msg_size:] 

    frame=pickle.loads(frame_data) 
    print frame.size 
    # cv2.imshow('frame', frame) 
    # cv2.waitKey(10) 

Client.py

import cv2 
import numpy as np 
import socket 
import sys 
import pickle 
import struct 

cap = cv2.VideoCapture(0) 
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
clientsocket.connect(('192.168.1.3', 8081)) 

while True: 
    ret,frame = cap.read() 
    data = pickle.dumps(frame) 
    clientsocket.sendall(struct.pack("L", len(data)) + data) 

我的笔记本电脑服务器接收不到任何数据。但是,当我在同一台设备上运行此客户端和服务器(例如,笔记本电脑上的服务器和客户端)时,它正常运行。

我能够从树莓发送数据到笔记本电脑(回声应用测试)。

谁能帮助我?

+2

为什么要使用TCP视频流而不是UDP其目的是这种用法 – Humoyun

回答

1

按照我的理解,你应该使用相同的端口,用于客户端和服务器,但使用的是两个不同的人,8083和8081

你检查防火墙是否打开常用的端口?

+0

。即使当我把我的端口号相同的,我不明白,它仍然是同样的问题。所有防火墙规则都允许在该端口上进行连接。 – Shinchan

+0

您是否检查过主机的实际IP(通过ipconfig获取)是否与您在程序中使用的IP相同? ping是否可以在两个方向上工作? – tfv

+0

我得到的问题是服务器中的“payload_size”变得非常大(7898745431321384897974964),因此程序处于无限循环。 – Shinchan

1

经过分析的时间,为什么server.py和client.py不工作(即使在防火墙被禁用),有一个在server.py代码中的错误:“这个词不应该是一个字符串”。因此,word =“”(这是一个字符串)应该改为word = b''(这是两个单引号来表示一个字节)。

+0

你能分享完整的代码吗?我在你的server.py代码中看不到“word =” – TaeWoo