如何在Python中流式传输二进制数据
我想用Python来传输二进制数据,但我不知道该怎么做。我已经用SOCK_DGRAM
创建了一个Python的socket程序。不过,SOCK_STREAM
有个问题,就是它在互联网上无法使用,因为我们的网络服务提供商不允许使用TCP服务器socket。
我想定期把屏幕截图传输到远程计算机。我有个想法,就是维护一个二进制数据的队列,并让两个线程同步地进行读写。我不想使用VNC。
我该怎么做呢?
我已经用SOCK_STREAM
写了服务器socket和客户端socket,它在本地是可以工作的,但在互联网上就不行,即使输入了正确的IP地址。我们还尝试在一台电脑上运行tomcat网页服务器,然后在另一台电脑上通过互联网访问,但也没有成功。
2 个回答
3
SOCK_STREAM 是用来传输数据的正确方式。
你提到的关于互联网服务提供商(ISP)的事情听起来不太对;他们并不控制你的机器是否在某个接口的特定端口上监听。也许你是在说防火墙或地址问题?
如果你坚持要使用 UDP(其实不建议这样,因为你需要担心数据包可能会乱序到达或者根本不送达),那么你首先需要使用 socket.bind
来绑定端口,然后在一个循环中使用 socket.recvfrom
来读取数据,并保持对连接的跟踪。这样做会比较复杂,需要花费不少精力才能做好。
2
这里有两个问题。
第一个问题是,你需要能够找到对方的地址。这和你提到的“在互联网上无法工作,因为大多数互联网服务提供商不允许TCP服务器套接字”有关。这个问题通常比较棘手,因为对方可能在一个叫做NAT或防火墙的保护后面。
至于第二个问题,就是在你能够建立TCP连接之后,实际传输数据的问题。如果你能找到对方的地址,Python的socket就可以正常工作。