python - 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
提示有关。顺便说一句,服务器端也适用,否则您应该循环,因为您可能会看到您的内容被截断;其他选项是也有一个发送循环。)。流套接字将保证您按照发送它们的顺序获取字节。就其本身而言,它不知道您的消息是否完整,并且它也不保证发送和接收数据的数量和大小(分别)。
服务器的内部循环继续读取,直到我们看到一个EOF
(我们在 python 中收到零长度字符串socket
)。这会发生(recv
在远程套接字(或至少它的写入端)关闭时返回。由于我们仍然想重用连接,我们只在客户端的发送端这样做。希望这可以帮助你前进。
推荐阅读
- android - 如何将逻辑提取到 viewModel?
- java - 采集传感器数据时如何获取经纬度?
- pyqt4 - Pyqt4 上的 QsciScintilla 用于 python35 错误(非官方 whl)
- virtual-machine - 在 vsphere 中使用 terraform 创建 VM 时出现自定义 VM 时出错
- css - 即使在类和 @-webkit-keyframes 上设置 -webkit- ,很棒的 CSS 动画也无法在 iOS 上运行
- docker - Docker 卷持久性
- spring - populating required fields only in the response of spring rest API
- c# - Xamarin 表单:如何从另一个内容页面获取条目文本的值
- python - Pandas read_csv 以浮点类型读取列中的列表
- php - 锚标记未出现在引导选项中