个人云空间||1.用python实现基于TCP的服务器下载和客户端上传文件
## 第一个星期,先实现一个基于tcp的文件传输功能。
对python并不是很熟悉,索性就边用边学,百度上有很多用tcp传输文件的例子
python开头为什么要有# -*- coding:utf-8 -*-
?
PY文件当中是不支持中文的,即使你输入的注释是中文也不行,为了解决这个问题,
就需要把文件编码类型改为UTF-8的类型,输入这个代码就可以让PY源文件里面有中文了。
本篇所遇到的问题:
1.if __name__ == '__main__':的作用:
"if name == ‘main’:"下的代码在文件直接作为脚本运行时才会被执行,而import在其他脚本中是不会被执行的。
2.socket_name.bind()函数里的参数是"(IP,Port)"。
3.传送文件或者字符串,得先在发送端把变量用"utf-8"编码encode,否则接收端会收到空串,然后得在接收端decode。
关于socket编程里socket()的参数,可以参照无名小妖的博客
https://www.cnblogs.com/wumingxiaoyao/p/7047658.html
开始下手:
先实现最简单的客户端和服务器通信
服务器端的运行逻辑:
创建socket——》绑定端口和IP——》监听listen()
——》while True:
conn,addr = XXX.accept() 接收客户端的请求连接,并建立新的连接conn——》conn.recv()接收客户端的文件请求——》read() 读取文件数据——》读到数据后,conn.send()发送给客户端
服务器端代码
from socket import * #将所有关于socket的库都加载
serverIP = ‘127.0.0.1’#本机地址
serverPort = 10055 #随便声明一个端口,要大于1024
#创建TCP套接字套接字
server_socket = socket(AF_INET, SOCK_STREAM)
#绑定端口号和IP地址
server_socket.bind((serverIP,serverPort))
#开始监听
server_socket.listen(5)
while True:
conn,addr = server_socket.accept()
while True:
#接收客户端的请求信息
file_name_data = conn.recv(1024)
if not file_name_data:#若收到空的文件
print("客户端断开连接")
break
#对二进制数据进行解码
file_name_data.decode("utf-8")
#判断文件是否存在
if os.path.exists(file_name)
#文件存在
with open(file_name,"rb") as file:
#读取文件数据
while True:
#循环读取文件数据
file_data = file.read(1024)
if file_data:
conn.send(file_data)#发送数据
else:
print("请求的文件数据发送完成")
break
else:
print("您请求下载的文件不存在")
#断开连接
print("服务器断开连接")
conn.close()
server_socket.close()
#
客户端逻辑:
创建套接字——》连接服务器,XXX.connet((IP,Port))——》发送文件请求XXX.send(file_name)(需要把file_name用utf-8编码)——》while True: recv()——》write()
客户端代码:
serverIP = '127.0.0.1'
serverPort = 10055
from socket import *
#创建客户端套接字
client_socket = socket(AF_INET,SOCK_STREAM)
#和服务器连接
client_socket.connect((serverIP,serverPort))
#发送下载文件请求
file_name = input("请输入要下载的文件名:")
#utf-8编码
file_name_data = file_name.encode("utf-8")
#发送请求数据
client_socket.send(file_name_data)
#把数据写入到文件里
with open("D:/计算机网络/socket编程/client共享区/"+file_name,"wb") as file:
while True:
file_data = client_socket.recv(1024)
if file_data:
file.write(file_data)
else:
print("服务器端把数据发送完成并关闭了连接")
break
client_socket.close()
就这样。