网络编程-- socket

利用socket实现一个简单的ssh
import socket import os # 获得socket实例 server = socket.socket() # 绑定监听地址端口 server.bind(("localhost", 39999)) # 打开监听 server.listen(1) while True: print('wating...') # 接受并建立与客户端的连接,程序在此处开始阻塞,只到有连接进来 conn,addr = server.accept() print("new_connect.", addr) while True: data = conn.recv(1024) if not data: break res = os.popen(data.decode()).read() # conn.send(data.upper()) if len(res) == 0: conn.send('command not found'.encode('utf-8')) continue # 把结果大小的长度发给客户端 conn.send(str(len(res.encode())).encode('utf-8')) # 把长度发给客户端 _res = conn.recv(1024) conn.send(res.encode("utf-8")) print(data) server.close()
import socket client = socket.socket() client.connect(('localhost', 39999)) while True: msg = input('>>> ').strip() if len(msg) == 0: continue client.send(msg.encode("utf-8")) # 接收server端发来的长度 data_size = client.recv(1024) if 'found' in data_size.decode(): print(data_size.decode()) continue client.send('starting...'.encode('utf-8')) received_size = 0 received_data = b'' while received_size < int(data_size.decode()): data = client.recv(1024) # 每次收到以的有可能小于1024,所有使用len判断 received_size += len(data) received_data += data else: print(received_data.decode()) client.close()
以上的程序,你会发现,只能支持单个客户端与服务端进行通信,而第二个要想与服务端通信,只能把第一个断开才行,这种就是形成了阻塞
以下实现一个支持多并发的服务端程序
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): """SocketServer""" def handle(self): while True: try: self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) except ConnectionResetError as e: print("Error", e) break if __name__ == '__main__': HOST, PORT = 'localhost', 39999 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) server.serve_forever()
小技巧(断言)
# 如果type(1) 是int类型的,就 打印'bbb'
assert type(1) is int
print('bbb')
异常处理
浙公网安备 33010602011771号