这是服务端(不好使)的代码
# 1、导入模块
import socket
# 2、创建套接字
tcp_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 调整套接字的权限
tcp_socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3、绑定端口和地址
tcp_socket_server.bind(("", 9090))
# 4、开始监听,将套接字设置为被动监听模式
tcp_socket_server.listen(128)
while True:
# 5、等待客户端连接
new_client_socket, ip_port = tcp_socket_server.accept()
while True:
# 6、接受客服端发来的文件名
recv_data = new_client_socket.recv(1024)
file_name = recv_data.decode("GBK")
if len(file_name) == 0:
break
# 7、根据文件名读取文件数据
try:
with open(file_name, "rb") as file:
# 8、讲读取的数据发给客户端(循环)
while True:
file_data = file.read(1024)
if file_data:
new_client_socket.send(file_data)
else:
break
except Exception as e:
print("文件%s下载失败!" % file_name)
else:
print("文件%s下载成功" % file_name)
# 9、关闭和客户端的连接
new_client_socket.close()
# 10、关闭服务器
# tcp_socket_server.close()
这是另外一个服务端代买(好使)
# 1、导入模块
import socket
# 2、创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置套接字地址可以重用
# tcp_server_socket.setsockopt(当前套接字, 属性名, 属性值)
# socket.SO_REUSEADDR 地址是否可以重用 True可以重用 False 不可以重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3、绑定端口
tcp_server_socket.bind(("", 9090))
# 4、设置监听,设置套接字由主动为被动
tcp_server_socket.listen(128)
# 5、接受客户端连接
while True:
new_client_socket, ip_port = tcp_server_socket.accept()
print("欢迎新客户端:", ip_port)
# 6、接收客户端发送的文件名
recv_data = new_client_socket.recv(1024)
file_name = recv_data.decode()
print(file_name)
try:
# 7、根据文件名读取文件内容
with open(file_name, "rb") as file:
# 8、把读取的内容发送给客户端(循环)
while True:
file_data = file.read(1024)
# 判断是否读取到了文件的末尾
if file_data:
# 发送文件
new_client_socket.send(file_data)
else:
break
except Exception as e:
print("文件%s下载失败!" % file_name)
else:
print("文件%s下载成功" % file_name)
# 9、关闭和当前客户端的连接
new_client_socket.close()
# 10、关闭服务器
# tcp_server_socket.close()
这是客户端的代码
# 1、导入模块
import socket
# 2、创建套接字
tcp_socket_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3、建立服务器与客户端的连接
while True:
server_ip = input("请输入服务器的ip地址:")
if len(server_ip) == 0:
server_ip = "192.168.220.129"
try:
while True:
server_port = input("请输入服务器的端口号地址:")
if len(server_port) == 0:
server_port = 9090
break
try:
server_port = int(server_port)
if server_port > 65535 or server_port < 0:
print("请输入1024-65535间的整数。")
continue
else:
break
except ValueError:
print("请输入1024-65535间的整数。")
break
except socket.gaierror:
print("请输入正确的网址或者IP地址。")
tcp_socket_client.connect((server_ip, server_port))
print("已连接到服务器。请输入要下载的文件名。\n")
while True:
# 4、接受用户输入的文件名
file_name = input("需要下载的文件名:\n")
if len(file_name) == 0:
break
# 5、将文件名发送到服务器端
tcp_socket_client.send(file_name.encode("GBK"))
# 6、接受服务器发送的内容并保存
# 注意字符串中包含转义字符的时候可以在字符串前加r来满足pep8
with open(r"D:\install\\" + file_name, "wb") as file:
while True:
file_data = tcp_socket_client.recv(1024)
# 判断数据是否传送完毕
if file_data:
file.write(file_data)
print(file_data)
else:
break
print("文件下载完成!")
# 7、关闭套接字
tcp_socket_client.close()
上头是我的代码块,利用客户端连接之后客户端每次接受文件都会卡住,有的时候可以接收到,有的时候就一直卡着,当把第二个while删除的时候就接受的飞快了= =,有没有人懂为什么啊。
以下是两个不同服务器代码的运行结果(同一个客户端)
因为在等连接
是不是你没退出循环
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y