socket通信
socket通信的伪代码流程:
socket简单的示例代码
client端的代码:
1 import socket 2 3 client = socket.socket() 4 client.connect(('localhost',3001)) 5 6 client.send(b'hhhh') 7 data = client.recv(1024) 8 print('recv:',data) 9 10 client.close()
1 客户端结果 2 >>> recv: b'HHHH'
server端的代码:
1 import socket 2 3 server = socket.socket() 4 5 server.bind(('localhost',3001)) #绑定要监听端口 6 server.listen() #监听 7 8 print('开始等待数据....') 9 10 #conn表示客户端连接到服务端生成的一个连接实例 11 conn,addr = server.accept() #等待数据 12 13 print(conn,addr) 14 15 16 print('数据来了') 17 data = conn.recv(1024) 18 print('recv:',data) 19 20 conn.send(data.upper()) 21 22 server.close()
1 服务端结果 2 >>> 开始等待数据.... 3 >>> <socket.socket fd=296, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 3001), raddr=('127.0.0.1', 54373)> ('127.0.0.1', 54373) 4 >>> 数据来了 5 >>> recv: b'hhhh'
socket多用户连接:
client端的代码:
1 import socket 2 import os 3 4 client = socket.socket() 5 client.connect(('localhost', 3001)) 6 while True: 7 #让用户自己输入要发送的信息msg,因为涉及到中文,所已用encode和decode进行转换 8 msg = input(">>>:").strip() 9 if len(msg) == 0: 10 continue 11 client.send(msg.encode("utf-8")) 12 data = client.recv(1024) 13 print('recv:', data.decode()) 14 15 client.close()
server端的代码:
1 import socket 2 import os 3 4 server = socket.socket() # 创建套接字 5 server.bind(('localhost', 3001)) # 绑定要监听端口 6 server.listen(1) # 监听,数据代表允许多少个链接 7 8 print('开始等待数据....') 9 # conn表示客户端连接到服务端生成的一个连接实例 10 # 先说第二个while,循环接收客户端数据,当客户端数据没有发送,服务端收到数据为空的时候跳出循环,这么做是因为这个程序如果想要一直接收客户端数据,就需要进行循环操作,但是如果收到数据为空,该循环就会进入一个死循环,所以需要判定条件,当客户端结束发送数据,然后结束连接; 11 # 然后第一个while,因为这里考虑测试多人单线程连接server,如果不加while,当客户端数据没有发送,server会直接断开连接,不接收下个新用户的请求数据,所以将一个连接实例放在循环里,当一个用户断开连接,回到上层,然后再接收新用户的数据。 12 while True: 13 conn, addr = server.accept() # 等待数据 14 print(conn, addr) 15 print('数据来了') 16 while True: 17 data = conn.recv(1024) 18 print('recv:', data) 19 if not data: 20 print('The client did not respond') 21 break 22 conn.send(data.upper()) 23 24 server.close()
socket简单的shell实现:
client端的代码:
import socket import os client = socket.socket() client.connect(('localhost', 3001)) while True: #让用户自己输入要发送的信息msg,因为涉及到中文,所已用encode和decode进行转换 msg = input(">>>:").strip() if len(msg) == 0: continue client.send(msg.encode("utf-8")) data = client.recv(1024) #print('recv:', data.decode()) print(data.decode()) client.close()
server端的代码:
import socket import os server = socket.socket() # 创建套接字 server.bind(('localhost', 3001)) # 绑定要监听端口 server.listen(1) # 监听,数据代表允许多少个链接 print('开始等待数据....') while True: conn, addr = server.accept() # 等待数据 print(conn, addr) print('数据来了') while True: data = conn.recv(1024) print('recv:', data) if not data: print('The client did not respond') break res = os.popen(data.decode()).read() #py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下 conn.send(res.encode("utf-8")) server.close()