socket架构

时间:2023-12-14 12:11:32

套接字基本概念

Socket是应用层与Tcp/ip协议族通信的中间软件抽象层,它是一组接口。在设计模式中,socket其实就是一个门面模式,它把复杂的tcp/ip协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。

socket位置:在传输层和应用层之间

套接字分为两种:

  • 基于文件型:AF_UNIX(af=address family)
  • 基于网络型:AF_INET/AF_INET6

套接字工作流程

socket架构

tcp链接建立及释放

socket架构

backlog syn请求进入到backlog(半连接池)

测试代码

tcp

服务端
import socket

ser = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #基于流式通信
ser.bind(('127.0.0.1',8888)) #以元祖形式
ser.listen(5) #最多多少链接,半连接池
conn,addr = ser.accept() #接受链接和地址,建立一个tcp链接
msg = conn.recv(1024)
print('msg from client is ',msg.decode('utf-8'))
msg_repl = 'replay'
conn.send(msg_repl.encode('utf-8'))
conn.close()
ser.close()
客户端
import socket

cli = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #基于流式通信
cli.connect(('127.0.0.1',8888)) #以元祖形式
# conn,addr = cli.accept() #接受链接和地址
msg = 'hello world'
cli.send(msg.encode('utf-8'))
data = cli.recv(1024)
print(data)
# cli.close()

udp

服务端
from socket import *
ip_port= ('127.0.0.1',8080)
buffer_size = 1024 udp_server = socket(AF_INET,SOCK_DGRAM)
udp_server.bind(ip_port) while True:
data = udp_server.recvfrom(buffer_size)
print(data)
udp_server.close()
客户端
from socket import *
ip_port= ('127.0.0.1',8080)
buffer_size = 1024 udp_server = socket(AF_INET,SOCK_DGRAM) while True:
data = udp_server.sendto('htllo'.encode('utf-8'),ip_port)
udp_server.close()