我正在尝试使用Python中的套接字发送UDP视频包。
服务器IP地址为:192.168.67.14
客户端IP地址为192.168.67.42
客户端和服务器可以相互ping。下面是用于建立套接字的代码:
服务器端:
import urllib, time, os, m3u8
from socket import *
# Socket initialization
s = socket(AF_INET, SOCK_DGRAM)
host = "192.168.67.42"
port = 5000
buf = 1024
addr = (host, port)
s.connect((host, port))
ts_filenames = []
while True:
playlist = "https://sevenwestmedia01-i.akamaihd.net/hls/live/224853/TEST1/master_lowl.m3u8"
m3u8_obj = m3u8.load(playlist)
ts_segments = m3u8_obj.__dict__.values()[6]
ts_segments_str = str(m3u8_obj.segments)
for line in ts_segments_str.splitlines():
if "https://" in line:
ts_id = line[-20:]
if ts_id not in ts_filenames:
print ts_id
ts_filenames.append(ts_id)
try:
ts_segment = urllib.URLopener()
ts_segment.retrieve(line, ts_id)
except:
pass
f = open(ts_id, "rb")
data = f.read(buf)
while (data):
if (s.sendto(data, addr)):
print "sending ..."
data = f.read(buf)
客户端
import socket
s = socket.socket()
host = '192.168.67.14'
port = 5000
s.connect((host,port))
print s.recv(1024)
s.close
例外情况:
Traceback (most recent call last): File "client.py", line 7, in s.connect((host,port)) File "/usr/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 111] Connection refused
我花了一些时间研究this discussion但是我仍然不确定要修改什么。有什么建议吗?
在客户端,这是错误的:
为了接收UDP数据包,您需要创建一个UDP套接字,就像在服务器端一样:
此外,如果希望客户端能够接收UDP数据包,则需要将其绑定到端口5000(connect()既不必要也不足够)。
你这里有很多问题。首先,通过在服务器端使用
connect
,您告诉操作系统您将只与IP地址“192.168.67.42”端口5000通信。这可能不是你想要的。(服务器通常会与任何客户机想要与其交谈的内容交谈。)其次,通过不在客户机中指定
SOCK_DGRAM
,您将获得默认的套接字类型,即SOCK_STREAM
。这意味着您的客户机正试图connect
到TCP端口80上的服务器,而不是UDP端口80(这两个名称空间是完全独立的)。对于UDP“会话”,双方都需要一个IP地址和一个端口号。如果不特别指定端口,操作系统将准随机地为您选择一个。为了连接客户机和服务器,他们必须至少就其中一个达成一致。
所以一个典型的UDP服务器会
bind
到一个众所周知的端口(可能您打算5000个这样做)。然后客户机可以connect
到该端口的服务器。代码如下所示(sans错误处理):服务器端:
客户机与您的位置很接近,但您应该先从客户机向服务器发送一些数据,以便服务器知道您的地址:
注意,因为您在客户端使用了
connect
,所以您已经永久地指定了对等方的地址,不需要使用recvfrom
和sendto
。相关问题 更多 >
编程相关推荐