![](/img/trans.png)
[英]Sending files between client - server through TCP socket in python?
[英]Python 3: Sending files through socket. (Client-Server Program)
我有上述问题。 客户端假设要求输入文件名并将文件名发送到服务器,之后服务器将打开文件并显示它。 问题是服务器没有打开文件并显示它。
以下是客户。
#!/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
请求的数据。
server.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()
client.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
(我们在python socket
收到零长度字符串)。 这会发生(当远程套接字(或至少它的写入端)被关闭时由recv
返回。由于我们仍然想重用连接,我们只在客户端的发送端执行此操作。希望这可以帮助您继续前进
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.