首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于TCP通信的ValueError

基于TCP通信的ValueError
EN

Stack Overflow用户
提问于 2016-01-20 13:32:34
回答 2查看 403关注 0票数 1

嗨,我正在尝试通过TCP发送加密文件。当运行服务器并发送一些文件时,一切正常,但当我再次发送时,服务器端会出现以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
File "server.py", line 38, in <module>
    f.write(l)
ValueError: I/O operation on closed file

我是新的TCP通讯,所以我不知道为什么文件关闭。

服务器代码:

代码语言:javascript
复制
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                 # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

f = open('file.enc','wb')
s.listen(5)                 # Now wait for client connection.
while True:
    c, addr = s.accept()     # Establish connection with client.
    print 'Got connection from', addr
    print "Receiving..."
    l = c.recv(1024)
    while (l):
        print "Receiving..."
        f.write(l)
        l = c.recv(1024)
    f.close()
    print "Done Receiving"
    decrypt_file('file.enc', key)
    os.unlink('file.enc')
    c.send('Thank you for connecting')
    c.close()                # Close the connection

客户代码:

代码语言:javascript
复制
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                 # Reserve a port for your service.
print '[1] send image'
choice = input('choice: ')

if choice == 1:
    encrypt_file('tosendpng.png', key)
    #decrypt_file('to_enc.txt.enc', key)

    s.connect((host, port))
    f = open('tosendpng.png.enc','rb')
    print 'Sending...'
    l = f.read(1024)
    while (l):
        print 'Sending...'
        s.send(l)
        l = f.read(1024)
    f.close()
    print "Done Sending"
    os.unlink('tosendpng.png.enc')
    s.shutdown(socket.SHUT_WR)
    print s.recv(1024)
    s.close()                     # Close the socket when done
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-20 13:37:17

据我所知,你的问题实际上与套接字无关。

f循环之前打开文件while,但在循环中关闭它。因此,当您第二次尝试写入f时,它就关闭了。这也正是错误告诉你的。

尝试将f = open('file.enc','wb')移动到while循环中以解决此问题。

票数 3
EN

Stack Overflow用户

发布于 2016-01-20 13:37:24

这个问题与TCP完全无关,您的代码是

代码语言:javascript
复制
f = open('file.enc','wb')
while True:
    ...    
    f.write(l)
    ...
    f.close()
    ...

第一个连接将正常工作,但在此期间文件将被关闭。将f = open('file.enc','wb')移动到while True循环中,以便在每次请求时重新打开文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34901462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档