本节演示简单的tcp文件下载案例
tcp服务器代码
读取客户端要下载的文件名, 打开该文件, 发送字节
import socket
def send_file_client(new_client_socket, client_addr):
# 1.获取客户端要下载的文件名
file_name = new_client_socket.recv(1024).decode("utf-8")
print("客户端"+str(client_addr)+"要下载的文件是"+file_name)
# 2.读取文件
file_content = None
try:
f = open(file_name, "rb")
file_content = f.read()
f.close()
except Exception as ret:
print("要下载的文件'"+file_name+"'不存在")
# 3.发送文件给客户端
if file_content:
new_client_socket.send(file_content)
def main():
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定本地信息
tcp_server_socket.bind(("", 8888))
# 3.设置被被动模式
tcp_server_socket.listen(128)
# 循环为客户端服务
while True:
# 4.等待客户端连接
new_client_socket, client_addr = tcp_server_socket.accept()
# 5.调用发送文件函数, 完成对客户端服务
send_file_client(new_client_socket, client_addr)
# 6.关闭套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__=="__main__":
main()
客户端代码
发送要下载的文件名
import socket
def main():
# 1.创建套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.输入服务器信息
dest_ip = input("请输入服务器ip:")
dest_port = int(input("请输入服务器端口:"))
# 3.连接服务器
tcp_socket.connect((dest_ip, dest_port))
# 4.输入要下载文件名
download_name = input("请输入要下载的文件:")
# 5.发送文件名给服务器
tcp_socket.send(download_name.encode("utf-8"))
# 6.从服务器接收文件, 要判断是否为空
rec_data = tcp_socket.recv(1024)
if rec_data:
# 7.保存数据到文件中
with open("下载"+download_name, "wb") as f:
f.write(rec_data)
# 8.关闭套接字
tcp_socket.close()
if __name__=="__main__":
main()
在python中, with open(xxx) 是文件操作异常的自动close, 而as是起一个别名
网络编程除了udp, tcp, 其实还有其他方式, 但没这么常用, 在网络安全课程中会接触到。
此外, tcp_server_socket.listen(128)表示最大同时监听128个客户端, 而每个操作系统对此语句的实现并不相同( 能同时服务多少个客户端, 与操作系统能力有关 )
tcp是面向连接的, 但并不是一对一, 而是多对一, 一个服务器可以同时服务多个客户端, 但我们所学习到的都只能同时服务单个客户端, 要同时服务多个客户端, 必须使用学习多任务, 我们后续学习的http协议, 也往往是基于多任务的。