day8-------socket网络编程

时间:2023-03-09 15:28:10
day8-------socket网络编程

简单的socket  一个server同时只能处理一个链接   代码如下:

 server端代码
#author = ruixin li import socket
server = socket.socket()
server.bind(("0.0.0.0",5000))
server.listen(5)
print("开始监听")
while True:
conn,addr = server.accept()
print("一个新连接")
print(conn,addr)
while True:
try:
data = conn.recv(1024)
print("收到的信息:",data)
conn.send(data.upper())
except ConnectionResetError as e:
print("客户端主动断开连接")
break
server.close()
 客户端程序

 import socket

 cli = socket.socket()
cli.connect(("localhost",5000))
while True:
inp = input("请输入指令:".strip())
if len(inp) == 0:
continue
else:
cli.send(inp.encode())
data = cli.recv(1024)
print(data)

python socket 实现简单的 ssh  命令

 #author  ruixin li

 import socket
import subprocess
ips = input("请输入绑定的IP:")
ports = int(input("请输入绑定的端口:"))
server = socket.socket()
server.bind((ips,ports))
server.listen(5)
print("开始监听")
while True:
print("跳到外部循环")
conn,addr = server.accept()
print("一个新连接")
print(conn,addr)
while True:
try:
date = conn.recv(1024)
if len(date) == 0:
print("收到0信息,服务器主动断开连接")
break
else:
print("收到的信息:",date)
msg = subprocess.Popen(date,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
data = msg.stdout.read()
print(data)
dataerr = msg.stderr.read()
print("err:",dataerr)
if len(data) == 0:
conn.send(dataerr)
else:
conn.send(data)
except ConnectionResetError as e:
print("客户端主动断开连接")
break
server.close() 客户端
 import socket
ips = input("请输入要连接的IP:")
ports = int(input("请输入要连接的端口:")) cli = socket.socket()
cli.connect((ips,ports))
while True:
inp = input("请输入指令:".strip())
if len(inp) == 0:
continue
else:
cli.send(inp.encode())
data = cli.recv(1024)
print(data)

socket 实现简单的FTP上传下载功能

 #客户端代码
#author : ruixin li import socket
import hashlib
import os
#ips = input("请输入要连接的IP:")
#ports = int(input("请输入要连接的端口:")) print("说明:下载服务器文件到当前路径")
cli = socket.socket()
cli.connect(("localhost",5000))
while True:
inp = input("请输入指令: 按Q退出: ".strip())
if len(inp) == 0:
continue
elif inp == "q":
exit()
elif inp.split()[0] == "get":
inp_file_name = inp.split()[1]
cli.send(inp.encode())
tmp = cli.recv(1024).decode()
print("文件大小",tmp)
print(type(tmp))
remote_file_size = int(tmp)
print("服务端返回文件总大小:",remote_file_size)
local_size = 0
cli.send("收到大小,请发文件内容".encode())
file_name = inp.split()[1]
f = open(file_name.split("/")[-1] + ".new","wb")
while local_size < remote_file_size:
#f = open(file_name + ".new","wb")
data = cli.recv(1024)
f.write(data)
local_size += len(data)
# f.close()
print("文件总大小:",remote_file_size,"接收到:",local_size)
else:
print("文件下载完成,文件总大小:",remote_file_size,"接收到:",local_size)
f.close()
cli.send("请发送MD5".encode())
remote_md5 = cli.recv(1024).decode()
print("接收到服务端的MD5:",remote_md5)
f = open(file_name.split("/")[-1] + ".new", "rb")
m2 = hashlib.md5()
for i in f:
m2.update(i)
print("本地文件MD5",m2.hexdigest())
f.close()
if m2.hexdigest() == remote_md5 :
print("文件校验成功")
else:
print("文件下载不完整")
elif inp.split()[0] == "put":
inp_file_name = inp.split()[1]
cli.send(inp.encode()) if os.path.isfile(inp_file_name): put_file_size = str(os.stat(inp_file_name).st_size).encode()
cli.send(put_file_size)
tmp = cli.recv(1024)
print("等待确认",tmp.decode())
f = open(inp_file_name,"rb")
for line in f:
cli.send(line)
f.close()
print("文件发送完毕") cli.close() #服务端代码 import socket
import subprocess
import os
import hashlib
#ips = input("请输入绑定的IP:")
#ports = int(input("请输入绑定的端口:"))
server = socket.socket()
server.bind(("localhost",5000))
server.listen(5)
print("开始监听")
while True:
print("跳到外部循环")
conn,addr = server.accept()
print("一个新连接")
print(conn,addr)
while True:
date = conn.recv(1024)
if len(date) == 0:
print("收到0信息,服务器主动断开连接")
break
else:
print("收到的信息:",date)
args1,file_name = date.split()
print("第一个参数",args1.decode(),"第二个参数",file_name.decode())
if args1.decode() == "get":
print("走下载")
if os.path.isfile(file_name.decode()):
file_total_size = str(os.stat(file_name.decode()).st_size).encode()
print(file_total_size)
print(type(file_total_size))
conn.send(file_total_size)
conn.recv(1024)
print("等待客户端ack应答")
f = open(file_name.decode(),"rb")
m = hashlib.md5()
for line in f:
conn.send(line)
m.update(line)
hash_md5 = (m.hexdigest())
print("文件MD5:",hash_md5)
f.close()
print("文件发送完毕")
tmp = conn.recv(1024)
print(tmp.decode())
conn.send(hash_md5.encode())
else:
print("文件不存在")
continue
elif args1.decode() == "put":
print("开始上传文件")
# if os.path.isfile(file_name.decode().split("/")[-1]):
# print("文件已存在")
# conn.send("文件已存在".encode()) remote_file_size = int(conn.recv(1024).decode())
print("收到客户端文件大小:",remote_file_size)
put_file_size = 0
conn.send("可以发送数据了".encode())
f = open(file_name.decode().split("/")[-1],"wb")
while put_file_size < remote_file_size:
recv_data = conn.recv(1024)
f.write(recv_data)
put_file_size += len(recv_data)
f.close()
print("文件总大小:",remote_file_size,"接收到的大小",put_file_size)