计网大作业:个人云空间

个人云空间||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()

就这样。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值