一、socket通信过程
TCP服务器端创建套接字 --> 绑定IP地址和端口 --> 监听客户端连接请求 --> 接收客户端连接(建立客户端连接) --> 阻塞直到有客户端连接 --> 处理请求(通信循环) --> 关闭连接 --> 关闭套接字
TCP客户端创建套接字 --> 连接服务端IP以及端口 --> 处理请求(通信循环) --> 关闭套接字
二、套接字函数
1.服务端套接字函数
s.bind(address)
将套接字绑定到地址,在AF_INET下,以元组(host,port)的形式表示地址。
s.listen(backlog)
开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
s.accept()
接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
2.客户端套接字函数
s.connect(address)
连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
3.公共套接字函数
s.recv(bufsize[,flag])
接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send(string[,flag])
发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.close()
关闭套接字。
三、代码实现(版本一)
实现效果:客户端单方面发送消息,服务端显示客户端发送的消息
server.py
import socket # 创建套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定ip地址与端口号 sock.bind(('127.0.0.1', 8080)) # 建立监听,最大连接数为5个 sock.listen(5) # 接收客户端的连接 conn, client_addr = sock.accept() # 通讯循环 while True: # 接收消息 msg = conn.recv(1024) # 最大接收字节数为1024 if not msg: continue print('client is sending: ' + msg.decode('utf-8')) # 断开连接 conn.close() # 关闭套接字 sock.close()
client.py
import socket # 创建套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务端 sock.connect(('127.0.0.1', 8080)) # 建立通讯循环 while True: msg = input('Enter your message: ') if msg == 'quit': print('communication ended') break sock.send(msg.encode('utf-8')) # Mac操作系统使用utf-8编码方式 # 断开连接 sock.close()
先运行server,再运行client
运行效果:(p1 client.py,p2 server.py)
四、代码实现(版本二)
服务端客户端互发消息
server.py
import socket # 创建套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定ip地址与端口号 sock.bind(('127.0.0.1', 8081)) # 建立监听,最大连接数为5个 sock.listen(5) # 接收客户端的连接 conn, client_addr = sock.accept() # 通讯循环 while True: # 接收消息 msg = conn.recv(1024) # 最大接收字节数为1024 if not msg: continue print('client is sending: ' + msg.decode('utf-8')) reply = input('reply: ') conn.send(reply.encode('utf-8')) # 断开连接 conn.close() # 关闭套接字 sock.close()
client.py
import socket # 创建套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务端 sock.connect(('127.0.0.1', 8081)) # 建立通讯循环 while True: msg = input('Enter your message: ') if msg == 'quit': print('communication ended') break sock.send(msg.encode('utf-8')) # Mac操作系统使用utf-8编码方式 reply = sock.recv(1024) print('server is sending: ' + reply.decode('utf-8')) # 断开连接 sock.close()
先运行server,再运行client
运行效果:(p1 client.py,p2 server.py)
来源:https://www.cnblogs.com/rainbow-ran/p/12535999.html