day26-2 基于TCP协议的套接字编程
基于TCP协议的套接字编程
套接字
套接字有两种,分别是基于文件型和基于网络型
- 基于文件类型的套接字家族:AF_UNIX,unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一文件系统间接完成通信
- 基于网络类型的套接字家族:AF_INET
套接字工作流程
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待用户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接
基于TCP协议的套接字编程(简单)
服务端
import socket
# 创建符合TCP协议的服务端
server = socket.socket(socket.AF_INET,
socket.SOCK_STREAM) # TCP协议称为流失协议,UDP称为数据报协议SOCK_DGRAM
# 绑定端口
server.bind(('127.0.0.1', 8000)) # 127.0.0.1代表本地
# 对端口进行监听
server.listen(5) # 半连接池,限制的是请求书
# 等待客户端连接
print('start....')
conn, client_addr = server.accept()
print('conn: ', conn)
print('client_addr: ', client_addr)
# 收到消息
data = conn.recv(1024) # 限制最大接收的字节数
print('来自客户端的数据: ', data)
# 回消息
conn.send(data.upper()) # 将数据变大写
# 关闭连接
conn.close()
# 关闭服务器
server.close()
客户端
import socket
# 创建符合TCP协议的客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端端口
client.connect(('127.0.0.1', 8000))
# 发送消息
client.send('hello'.encode('utf8'))
# 接收服务端返回的消息
data = client.recv(1024)
print('来自服务端的数据:', data)
# 关闭客户端
client.close()
基于TCP协议的套接字编程(循环)
服务端
import socket
# 创建符合TCP协议的服务端
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
server.bind(('127.0.0.1', 8000))
# 对端口进行监听
server.listen(5)
# 等待客户端连接
print('start...')
# 链接循环
while True:
conn, client_addr = server.accept()
# 通信循环
while True:
try:
# 接收消息
data = conn.recv(1024)
print('来自客户端的数据:', data)
# 回消息
conn.send(data)
except ConnectionResetError: # 捕捉客户端与服务端关闭连接
break
客户端1
import socket
# 创建符合TCP协议的客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端端口
client.connect(('127.0.0.1', 8000))
while True:
# 发送消息
msg = input('please enter msg>>>')
client.send(msg.encode('utf8'))
# 接收消息
data = client.recv(1024)
print('来自服务端的数据:', data.upper())
客户端2
import socket
# 创建符合TCP协议的客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端端口
client.connect(('127.0.0.1', 8000))
while True:
# 发送消息
msg = input('please enter msg>>>')
client.send(msg.encode('utf8'))
# 接收消息
data = client.recv(1024)
print('来自服务端的数据:', data.upper())
在服务器连接客户端1时,虽然能监听客户端2,但不能给客户端2返回消息,将客户端1关闭后即断开连接,给客户端2返回数据