蟒蛇socket编程,用于传输图片(python socket programming for tr

2019-10-30 09:03发布

我是新在Python Socket编程。 这里是在Mininet主机打开TCP套接字和从一个主机发送相片到另一个的一个例子。 其实我改变,我已用于发送一个简单的消息到另一台主机(代码接收到的数据写入到一个文本文件中的顺序),以满足我的要求。 虽然当我实现这个修改后的代码,没有任何错误,它似乎正确地转移,我不知道这是否是做这个传输或不正确的方式。 由于我在同一台机器上的两台主机,我想这可能对结果产生影响。 我想请你检查这是否是转让或者我应该添加或删除一些正确的方式。

mininetSocketTest.py#!的/ usr / bin中/蟒蛇

from mininet.topo import Topo, SingleSwitchTopo
from mininet.net import Mininet
from mininet.log import lg, info
from mininet.cli import CLI

def main():
    lg.setLogLevel('info')

    net = Mininet(SingleSwitchTopo(k=2))
    net.start()

    h1 = net.get('h1')
    p1 = h1.popen('python myClient2.py')

    h2 = net.get('h2')
    h2.cmd('python myServer2.py')

    CLI( net )
    #p1.terminate()
    net.stop()

if __name__ == '__main__':
     main()

myServer2.py

import socket
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('10.0.0.1', 12345))

buf = 1024
f = open("2.jpg",'wb')

s.listen(1)
conn , addr = s.accept()
while 1:
    data = conn.recv(buf)
    print(data[:10])
    #print "PACKAGE RECEIVED..."
    f.write(data)   
    if not data: break
    #conn.send(data)
conn.close()
s.close()

myClient2.py:

import socket
import sys

f=open ("1.jpg", "rb")
print sys.getsizeof(f)
buf = 1024
data = f.read(buf)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('10.0.0.1',12345))


while (data):
    if(s.sendall(data)):
        #print "sending ..."
        data = f.read(buf)
        print(f.tell(), data[:10])
    else:
         s.close()
s.close()

Answer 1:

这个循环在client2是错误的:

while (data):
    if(s.send(data)):
        print "sending ..."
        data = f.read(buf)

由于send文档说:

返回发送的字节数。 应用程序负责检查所有数据已发送; 如果只有一些数据被传送时,应用程序需要尝试的剩余数据的递送。 有关此主题的更多信息,请参阅Socket编程HOWTO 。

你甚至没有试图做到这一点。 所以,虽然它可能工作在本地主机,一个轻负载的机器上,用短小的文件,它会尽快打破,当你试图使用它的真实。

作为帮助说,你需要做的事情为客户提供缓冲的休息。 由于可能没有很好的理由,你不能只阻塞,直到这一切都送,做最简单的事情就是打电话给sendall

不像的send(),此方法继续到直到所有数据已被发送或发生错误的字节从发送数据。 无返回成功。 上的错误,则会引发异常...


这带来了下一个问题:你没有做任何异常处理任何地方。 也许这是好的,但通常它不是。 例如,如果你的插槽中发生故障,但另一个仍上涨,你想终止整个程序和难以放下你的连接,或者你也许要完成发送你有什么第一?

你应该至少可能使用一个with的条款finally ,以确保您close干净你的插座,这样对方会得到一个不错的EOF,而不是例外。


此外,您的服务器代码只是提供一个单一的客户端,然后退出。 是,其实你想要的吗? 通常情况下,即使你不需要并发客户端,你至少要循环各地接受并维护一个接一个。


最后,服务器几乎总是想这样做:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

没有这一点,如果你试图在几秒钟内再次运行该服务器后,它完成(一个特定于平台的秒数,甚至可能取决于它是否有一个例外,而不是正常关机结束),该bind会失败,同样的方式,如果你试图将一个套接字实际上是被其他程序结合。



Answer 2:

首先,你应该使用TCP和UDP没有。 TCP将确保您的客户端/服务器收到整个照片正常。 UDP是更多地用于内容流。 绝对不是你的使用情况。



文章来源: python socket programming for transferring a photo