创建客户端与服务器,实现客户端能从服务器下载与上传文件
tcp创建套接字(socket)知识总结:
tcp客户端创建
1.创建套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCKJ_STREAM)
2.链接服务器
tcp_client_socket.connect(("server_ip",server_port))
3.向服务器发送数据
tcp_client_socket.send("data".encode("utf-8"))
4.接收服务器回送数据
recv_data = tcp_client_socket.recv(1024)
5.关闭套接字
tcp_client_socket.close()
tcp服务器创建
1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
2.绑定端口信息
tcp_server_socket.bind(("",8080))
3.监听,主动变被动
tcp_server_socket.listen(128)
4.等待客户端连接,堵塞状态,链接后返回一个新的套接字为客户端服务,以及客户端的ip、port.
new_client_socket,client_addr = tcp_server_socket.accept()
5.等待客户端发送数据
recv_data = tcp_client_socket.recv(1024).decode("utf-8")
6.给客户端回送数据
new_client_socket.send('hello'.encode("utf-8"))
7.为该客户端服务完毕之后关闭套接字
new_client_socket.close()
8.关闭套接字服务器
tcp_server_socket.close()
代码如下,欢迎指点,共同进步!
tcp客户端创建
import socket
def down(tcp_client_socket):
"""从服务器下载"""
while True:
# 发送请求
data = input("输入要下载的文件或按exit退出\n")
if data == "exit":
tcp_client_socket.send(data.encode("utf-8"))
break
elif data:
# 发送文件名
tcp_client_socket.send(data.encode("utf-8"))
# 接收数据
print("等待下载")
recv_data = tcp_client_socket.recv(1024*1024)
if recv_data == b"msg":
print("文件不存在或内容为空")
elif recv_data:
# 保存文件
with open("[新]" + data, "wb") as f:
f.write(recv_data)
print("下载成功")
def up(tcp_client_socket):
"""给服务器上传"""
while True:
# 发送请求
data = input("输入要上传的文件或按exit退出\n")
if data == "exit":
tcp_client_socket.send(data.encode("utf-8"))
break
elif data:
tcp_client_socket.send(data.encode("utf-8"))
msg = None
flag = True
try:
# 打开文件
f = open(data, "rb")
msg = f.read(1024*1024)
f.close()
except Exception:
print("文件不存在")
tcp_client_socket.send(b"msg")
flag = False
if msg:
# 发送数据
tcp_client_socket.send(msg)
print("上传完成")
elif msg == b"" and flag == True:
print("文件内容为空")
tcp_client_socket.send(b"msg")
def main():
"""文件操作客户端"""
# 创建套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 链接服务器
server_ip = input("服务器ip\n")
server_port = int(input("端口\n"))
tcp_client_socket.connect((server_ip, server_port))
# tcp_client_socket.connect(("192.168.142.1", 8080))
while True:
# 发送选择信息
choose = input("1(下载),2(上传),3(退出客户端),(输入密码关闭服务器)\n")
# 给服务器发送操作代号
tcp_client_socket.send(choose.encode("utf-8"))
# 下载
if choose == "1":
down(tcp_client_socket)
# 上传
elif choose == "2":
up(tcp_client_socket)
# 退出客户端
elif choose == "3":
break
# 关闭服务器
elif choose == "123456":
print("服务器已关闭")
break
# 输入有误
else:
print("输入有误")
# 关闭客户端套接字
tcp_client_socket.close()
if __name__ == '__main__':
main()
tcp服务器创建
import socket
def down(new_client_socket):
"""下载数据"""
# 接受数据
while True:
data = new_client_socket.recv(1024).decode("utf-8")
if data == "exit":
break
else:
flag = True
msg = None
try:
# 打开文件
f = open(data, "rb")
msg = f.read(1024*1024)
f.close()
except Exception:
print("文件不存在")
new_client_socket.send(b"msg")
flag = False
if msg:
# 发送数据
new_client_socket.send(msg)
print("下载完成")
elif msg == b"" and flag == True:
print("文件内容为空")
new_client_socket.send(b"msg")
def up(new_client_socket):
"""上传"""
while True:
print("#"*5)
data = new_client_socket.recv(1024).decode("utf-8")
if data == "exit":
break
else:
msg = new_client_socket.recv(1024*1024)
if msg == b"msg":
print("客户端没找到文件或文件内容为空")
continue
else:
# 保存文件
with open("[新]" + data, "wb") as f:
f.write(msg)
print("保存成功")
def main():
"""文件down up服务器"""
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# server_ip = input("设置服务器ip\n")
# server_port = int(input("设置服务器port\n"))
server_ip = "192.168.142.1"
server_port = 8080
# 绑定端口
tcp_server_socket.bind((server_ip,server_port ))
while True:
flag = True
# 监听
tcp_server_socket.listen(128)
print("监听中")
# 等待连接
print("等待连接")
new_client_socket,client_addr = tcp_server_socket.accept()
print("连接成功")
print("*"*10)
while True:
print("选择中")
choose = new_client_socket.recv(1024).decode("utf-8")
if choose == "1":
# 接受请求/发送数据
print("准备下载")
down(new_client_socket)
elif choose == "2":
# 上传数据
print("准备上传")
up(new_client_socket)
elif choose == "3":
# 退出循环
break
elif choose == "123456":
# 关闭服务器
tcp_server_socket.close()
flag = False
break
# 关闭套接字
new_client_socket.close()
if flag == False:
print("服务器已关闭")
break
if __name__ == "__main__":
main()