简单的socket 一个server同时只能处理一个链接 代码如下:
1 server端代码 2 #author = ruixin li 3 4 import socket 5 server = socket.socket() 6 server.bind(("0.0.0.0",5000)) 7 server.listen(5) 8 print("开始监听") 9 while True: 10 conn,addr = server.accept() 11 print("一个新连接") 12 print(conn,addr) 13 while True: 14 try: 15 data = conn.recv(1024) 16 print("收到的信息:",data) 17 conn.send(data.upper()) 18 except ConnectionResetError as e: 19 print("客户端主动断开连接") 20 break 21 server.close()
1 客户端程序 2 3 import socket 4 5 6 cli = socket.socket() 7 cli.connect(("localhost",5000)) 8 while True: 9 inp = input("请输入指令:".strip()) 10 if len(inp) == 0: 11 continue 12 else: 13 cli.send(inp.encode()) 14 data = cli.recv(1024) 15 print(data)
python socket 实现简单的 ssh 命令
1 #author ruixin li 2 3 import socket 4 import subprocess 5 ips = input("请输入绑定的IP:") 6 ports = int(input("请输入绑定的端口:")) 7 server = socket.socket() 8 server.bind((ips,ports)) 9 server.listen(5) 10 print("开始监听") 11 while True: 12 print("跳到外部循环") 13 conn,addr = server.accept() 14 print("一个新连接") 15 print(conn,addr) 16 while True: 17 try: 18 date = conn.recv(1024) 19 if len(date) == 0: 20 print("收到0信息,服务器主动断开连接") 21 break 22 else: 23 print("收到的信息:",date) 24 msg = subprocess.Popen(date,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) 25 data = msg.stdout.read() 26 print(data) 27 dataerr = msg.stderr.read() 28 print("err:",dataerr) 29 if len(data) == 0: 30 conn.send(dataerr) 31 else: 32 conn.send(data) 33 except ConnectionResetError as e: 34 print("客户端主动断开连接") 35 break 36 server.close()
客户端
1 import socket 2 ips = input("请输入要连接的IP:") 3 ports = int(input("请输入要连接的端口:")) 4 5 cli = socket.socket() 6 cli.connect((ips,ports)) 7 while True: 8 inp = input("请输入指令:".strip()) 9 if len(inp) == 0: 10 continue 11 else: 12 cli.send(inp.encode()) 13 data = cli.recv(1024) 14 print(data)
socket 实现简单的FTP上传下载功能
1 #客户端代码 2 #author : ruixin li 3 4 5 import socket 6 import hashlib 7 import os 8 #ips = input("请输入要连接的IP:") 9 #ports = int(input("请输入要连接的端口:")) 10 11 12 print("说明:下载服务器文件到当前路径") 13 cli = socket.socket() 14 cli.connect(("localhost",5000)) 15 while True: 16 inp = input("请输入指令: 按Q退出: ".strip()) 17 if len(inp) == 0: 18 continue 19 elif inp == "q": 20 exit() 21 elif inp.split()[0] == "get": 22 inp_file_name = inp.split()[1] 23 cli.send(inp.encode()) 24 tmp = cli.recv(1024).decode() 25 print("文件大小",tmp) 26 print(type(tmp)) 27 remote_file_size = int(tmp) 28 print("服务端返回文件总大小:",remote_file_size) 29 local_size = 0 30 cli.send("收到大小,请发文件内容".encode()) 31 file_name = inp.split()[1] 32 f = open(file_name.split("/")[-1] + ".new","wb") 33 while local_size < remote_file_size: 34 #f = open(file_name + ".new","wb") 35 data = cli.recv(1024) 36 f.write(data) 37 local_size += len(data) 38 # f.close() 39 print("文件总大小:",remote_file_size,"接收到:",local_size) 40 else: 41 print("文件下载完成,文件总大小:",remote_file_size,"接收到:",local_size) 42 f.close() 43 cli.send("请发送MD5".encode()) 44 remote_md5 = cli.recv(1024).decode() 45 print("接收到服务端的MD5:",remote_md5) 46 f = open(file_name.split("/")[-1] + ".new", "rb") 47 m2 = hashlib.md5() 48 for i in f: 49 m2.update(i) 50 print("本地文件MD5",m2.hexdigest()) 51 f.close() 52 if m2.hexdigest() == remote_md5 : 53 print("文件校验成功") 54 else: 55 print("文件下载不完整") 56 elif inp.split()[0] == "put": 57 inp_file_name = inp.split()[1] 58 cli.send(inp.encode()) 59 60 if os.path.isfile(inp_file_name): 61 62 put_file_size = str(os.stat(inp_file_name).st_size).encode() 63 cli.send(put_file_size) 64 tmp = cli.recv(1024) 65 print("等待确认",tmp.decode()) 66 f = open(inp_file_name,"rb") 67 for line in f: 68 cli.send(line) 69 f.close() 70 print("文件发送完毕") 71 72 73 74 75 cli.close() 76 77 78 79 80 81 82 83 84 #服务端代码 85 86 87 import socket 88 import subprocess 89 import os 90 import hashlib 91 #ips = input("请输入绑定的IP:") 92 #ports = int(input("请输入绑定的端口:")) 93 server = socket.socket() 94 server.bind(("localhost",5000)) 95 server.listen(5) 96 print("开始监听") 97 while True: 98 print("跳到外部循环") 99 conn,addr = server.accept() 100 print("一个新连接") 101 print(conn,addr) 102 while True: 103 date = conn.recv(1024) 104 if len(date) == 0: 105 print("收到0信息,服务器主动断开连接") 106 break 107 else: 108 print("收到的信息:",date) 109 args1,file_name = date.split() 110 print("第一个参数",args1.decode(),"第二个参数",file_name.decode()) 111 if args1.decode() == "get": 112 print("走下载") 113 if os.path.isfile(file_name.decode()): 114 file_total_size = str(os.stat(file_name.decode()).st_size).encode() 115 print(file_total_size) 116 print(type(file_total_size)) 117 conn.send(file_total_size) 118 conn.recv(1024) 119 print("等待客户端ack应答") 120 f = open(file_name.decode(),"rb") 121 m = hashlib.md5() 122 for line in f: 123 conn.send(line) 124 m.update(line) 125 hash_md5 = (m.hexdigest()) 126 print("文件MD5:",hash_md5) 127 f.close() 128 print("文件发送完毕") 129 tmp = conn.recv(1024) 130 print(tmp.decode()) 131 conn.send(hash_md5.encode()) 132 else: 133 print("文件不存在") 134 continue 135 elif args1.decode() == "put": 136 print("开始上传文件") 137 # if os.path.isfile(file_name.decode().split("/")[-1]): 138 # print("文件已存在") 139 # conn.send("文件已存在".encode()) 140 141 remote_file_size = int(conn.recv(1024).decode()) 142 print("收到客户端文件大小:",remote_file_size) 143 put_file_size = 0 144 conn.send("可以发送数据了".encode()) 145 f = open(file_name.decode().split("/")[-1],"wb") 146 while put_file_size < remote_file_size: 147 recv_data = conn.recv(1024) 148 f.write(recv_data) 149 put_file_size += len(recv_data) 150 f.close() 151 print("文件总大小:",remote_file_size,"接收到的大小",put_file_size)