【问题标题】:socket programming for transferring a photo in python用于在 python 中传输照片的套接字编程
【发布时间】:2023-03-13 20:48:02
【问题描述】:

我是 python 中套接字编程的新手。这是一个在 Mininet 主机中打开 TCP 套接字并将照片从一台主机发送到另一台主机的示例。事实上,为了满足我的要求,我已经更改了用于向另一台主机 (writing the received data to a text file) 发送简单消息的代码。 但是当我运行这段代码时,我在发送方遇到了这个错误:

144
Traceback (most recent call last):
  File mmyClient2,pym, line 13, in <module> 
    if(s.sendall(data)):
  File m/usr/lib/python2.7/socket.pym, line 228, in meth
    return yetattr[self,_sockename](*args) 
  File m/usr/lib/python2.7/socket.pym, line 174, in _dummy 
    raise error(EBADF, 'Bad file descriptor') 
socket,error: [Errno 9] Bad file descriptor  

那怎么了?

接收器.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()

发件人.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])
s.close()

s.sendall()好像有问题,因为当我改成s.send()时,没有报错,照片传输成功。所以我的问题是:虽然我在本网站的上一个问题中建议使用 s.sendall() 而不是 s.send(),但不这样做有错吗?

【问题讨论】:

  • 很可能引发了异常,因为您在套接字上调用了 s.close(),然后在您的 while 循环的下一次迭代中尝试在现已关闭的套接字上调用 s.sendall()。跨度>
  • @JeremyFriesner 你是指哪个 s.close() ?处于 else 状态的那个?我删除了它。虽然错误消失了,但我在 receiver.py 中有一个无限循环,它打印 .adobe.com ...

标签: python sockets file-transfer


【解决方案1】:

发送完所有数据后,你关闭了socket。然后再次使用关闭的socket,这会导致错误。你可以这样写sender。

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 1:
    if not data:
        break
    s.sendall(data)
    data = f.read(buf)
s.close()

【讨论】:

  • 好的,我将s.close() 替换为break。但是仍然存在问题,我的照片没有正确传输。只有当我将s.sendall() 更改为s.send() 时,这张照片传输似乎是正确的。但是,在我之前的问题 (stackoverflow.com/questions/51274595/…) 中,为了让我的转移能够正确和完整地进行,我应该使用 sendall() 而不是 send()... 但是当我这样做时,我会遇到错误或无限循环
  • @helen 试试新的。这在 Fedora 操作系统中对我有用。
  • 谢谢。这解决了s.sendall() 问题。但是当我运行这两个代码时,sender.py 的输出中会出现 144 (因为它也出现在我的第一个错误中)。它是什么,为什么会发生?
  • 144 是文件的长度。 print sys.getsizeof(f)
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多