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()