Python 3:通过套接字发送文件.(客户端-服务器程序)



我遇到了上述问题。假设客户端请求一个文件名并将文件名发送到服务器,然后服务器将打开文件并显示。问题是服务器没有打开并显示文件。

下面是客户。

#!/usr/bin/env python3 
import socket, os.path, datetime, sys
def Main():
host = '127.0.0.1'
port = 50001
s = socket.socket()
s.connect((host, port))
Filename = input("Type in ur file ")
s.send(Filename.encode('utf-8'))
data = s.recv(1024).decode('utf-8')
s.close()
if __name__ == '__main__':
Main()

下面是服务器

#!/usr/bin/env python3
import socket
import os
import sys

def Main():
host = '127.0.0.1'
port = 50001
s = socket.socket()
s.bind((host,port))
print("server Started")
s.listen(1)
c, addr = s.accept()
print("Connection from: " + str(addr))
while True:
data = c.recv(1024).decode('utf-8')
myfile = open(data, "r")
if not data:
break
print("from connected user: " + myfile)
c.close()
if __name__ == '__main__':
Main()

我对运行它的代码进行了一些最小的调整,以便server.py在给定端口上连续侦听,并发送回每次调用client.py所要求的数据。

服务器.py

#!/usr/bin/env python3
import socket
import os
import sys
def Main():
host = '127.0.0.1'
port = 50001
s = socket.socket()
s.bind((host,port))
print("server Started")
s.listen(1)
while True:
c, addr = s.accept()
print("Connection from: " + str(addr))
filename = ''
while True:
data = c.recv(1024).decode('utf-8')
if not data:
break
filename += data
print("from connected user: " + filename)
myfile = open(filename, "rb")
c.send(myfile.read())
c.close()
if __name__ == '__main__':
Main()

客户端.py

#!/usr/bin/env python3 
import socket, os.path, datetime, sys
def Main():
host = '127.0.0.1'
port = 50001
s = socket.socket()
s.connect((host, port))
Filename = input("Type in ur file ")
s.send(Filename.encode('utf-8'))
s.shutdown(socket.SHUT_WR)
data = s.recv(1024).decode('utf-8')
print(data)
s.close()
if __name__ == '__main__':
Main()

现在来解释一下。

在服务器端。外部循环接受一个连接,然后从连接中读取,直到完成为止(稍后将对此进行详细介绍(。打印您的调试信息,但请注意,您试图print文件对象,而不是文件名(尝试连接时会失败(。我也以二进制模式打开文件(这样我就可以跳过str->bytes翻译。

在客户端。我添加了在发送文件时关闭套接字的写入端。请注意,您可能希望在此用例中使用sendall而不是send:有关详细信息,请查看这些文档链接。我为传入的数据添加了一个print

现在,关闭客户端的写入端和内部循环读取(也与sendall提示有关。哪个BTW对服务器端也适用,否则你应该循环,因为你可能会看到你的内容被截断;另一个选项是也有一个发送循环。(。流套接字将保证你按照发送字节的顺序获得字节。就其本身而言,它不知道您的消息是否完整,也不能保证发送和接收数据的块数和大小(分别(。

服务器的内部循环一直读取,直到我们看到一个EOF(我们在pythonsocket中收到了零长度的字符串(。这种情况会发生(当远程套接字(或至少其写入端(关闭时,recv会返回(。由于我们仍然希望重用连接,所以我们只在客户端的发送端这样做。希望这能帮助你继续前进。

相关内容

最新更新