socket 编程
-客户端/服务器架构 :即 C/S架构
1,硬件C/S 架构(打印机)
2, 软件C/S 架构(web服务)
C/S架构与socket的关系:socket就是为了完成C/S架构的开发
-osi 七层:
应用层--运输层--网络层--链路层--物理层
socket 抽象层在应用层和运输层之间
socket概念(socket也是套接字)
socket是应用层和TCP/IP协议中间通信的软件层,它是一组接口,在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议封装隐藏在socket接口后,让socket去组织数据,以符合指定协议,所以只需遵循socket规定去编程就可以。
套接字分为2种:
-基于文件型的套接字家族 AF_UNIX
用于一台机器的不同程序之间
linux 一切皆文件,基于文件的套接字调用的是底层的文件系统来取数据,2个套接字进程运行在同一个机器,可以通过访问同一个文件系统来间接完成通信
-基于网络类型的套接字家族 AF_INET
用于网络编程
通过网络来实现2个程序通讯
socket 运行流程图如下:
例如:
服务端:
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#socket.SOCK_STREAM 是基于流的通讯方式,也就是TCP
#socket.AF_INET 代表是网络嵌套家族类型
phone.bind(('192.168.1.4',8000))
#括号内写IP地址+端口 自己电脑IP是 192.168.1.4 ,监听端口是8000
phone.listen(5) #代表同时可以接5个电话
conn,addr =phone.accept()
msg=conn.recv(1024)# 收消息 ,1024代表可以接收多少字节的信息
print('客户端发来的消息是',msg)
conn.send(msg.upper())#发消息
conn.close()
phone.close()
客户端
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('192.168.1.4',8000))
phone.send('hello'.encode('utf-8'))#发消息
data =phone.recv(1024) #收消息
print('收到服务端发来的消息',data)
运行结果是:
服务端:客户端发来的消息是 b'hello'
客户端:收到服务端发来的消息 b'HELLO'
socket 底层工作原理