HongKongPython 2019-12-29
伪代码(方便理解)
发送端
import socket socket.TCP/IP connect(a.ip, a.port) socket.send(hello) socket.recv() socket.close()
接收端
import socket socket.TCP/IP listen(0.0.0.0, 3306) waiting() recv() send
实例
socket消息发送与接受simple
服务端
# 服务器端 import socket server = socket.socket() server.bind((‘localhost‘, 5520)) # 绑定要监听端口 server.listen(5) # 监听 print("我要开始等电话了") while True: conn, addr = server.accept() # 等电话打进来 # conn就是客户端连过来二在服务器端为其生成的一个连接实例 print("电话来了") while True: data = conn.recv(1024) print("recv:", data.decode()) if not data: print("client has lost...") break conn.send(data.upper()) server.close()
客户端
# 客户端 import socket client = socket.socket() # 声明socket类型,同时生成socket连接对象 client.connect((‘localhost‘, 5520)) while True: msg = input(">>:").strip() if len(msg) == 0: continue # client.send(b"Hello World!") client.send(msg.encode(encoding="utf-8")) data = client.recv(1024) print("recv:", data.decode()) client.close()
先运行服务端 再 运行客户端
socket实现简单的ssh
服务端
import socket import os import time server = socket.socket() server.bind((‘localhost‘, 9999)) server.listen() while True: conn, addr = server.accept() print("new conn:", addr) while True: print("等待新指令") data = conn.recv(1024) if not data: print("客户端已断开") break print("执行指令:", data) cmd_res = os.popen(data.decode()).read() #接受字符串,执行结果还是字符串 if len(cmd_res) == 0: cmd_res = "cmd hs no output..." conn.send(str(len(cmd_res.encode())).encode("utf-8")) # 先发大小给客户端 # time.sleep(0.5) client_ack = conn.recv(1024) # wait client to confirm conn.send(cmd_res.encode("utf-8")) server.close()
客户端
import socket client = socket.socket() client.connect((‘localhost‘, 9999)) while True: cmd = input(">>:").strip() if len(cmd) == 0: continue client.send(cmd.encode("utf-8")) cmd_res_size = client.recv(1024) # 接受命令结果的长度 print("命令结果大小:", cmd_res_size) client.send("准备好接受了".encode("utf-8")) received_size = 0 received_data = b‘‘ while received_size < int(cmd_res_size.decode()): data = client.recv(1024) received_size += len(data) # 每次收到的有可能小于1024,所以必须用len判断 # print(data.decode()) received_data += data else: print("cmd res receive done...", received_size) print(received_data.decode()) # cmd_res = client.recv(1024) # print(cmd_res.decode()) client.close()
先运行服务端,再运行客户端。示例:在客户端里输入 ipconfig
>>:ipconfig 命令结果大小: b‘950‘ cmd res receive done... 950 Windows IP 配置 以太网适配器 以太网: 媒体状态 . . . . . . . . . . . . : 媒体已断开连接 连接特定的 DNS 后缀 . . . . . . . : 无线局域网适配器 本地连接* 3: 媒体状态 . . . . . . . . . . . . : 媒体已断开连接 连接特定的 DNS 后缀 . . . . . . . : 无线局域网适配器 本地连接* 4: 媒体状态 . . . . . . . . . . . . : 媒体已断开连接 连接特定的 DNS 后缀 . . . . . . . : 无线局域网适配器 WLAN: 连接特定的 DNS 后缀 . . . . . . . : 本地链接 IPv6 地址. . . . . . . . : fe80::80b9:520a:30e8:b823%19 IPv4 地址 . . . . . . . . . . . . : 10.64.226.255 子网掩码 . . . . . . . . . . . . : 255.255.192.0 默认网关. . . . . . . . . . . . . : 10.64.192.1 以太网适配器 蓝牙网络连接: 媒体状态 . . . . . . . . . . . . : 媒体已断开连接 连接特定的 DNS 后缀 . . . . . . . :