目录
scoket套接字
基于文件类型的套接字家族名字:AF_UNIX
基于网络类型的套接字家族名字:AF_IN
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
例如我们每天浏览网页、QQ 聊天、收发 email 等等
1.socket介绍
1.什么是socket?
socket套接字,是进程通信的一种实现方式
2.主要特点
主要针对不同主机之间的通信。即网络进程的通信,
几乎所有的网络都是通et流程,实现网络通信
socket工作流程
TCP服务端
首先拿到一个socket对象,socket对象与IP+PORT绑定才能进行端口监听.
然后socket对象监听端口是否有请求,同时调用accept方法,一直阻塞等待客户端的链接;
如果有客户端的请求发来,那么服务端接收到请求之后调用read方法读取数据;
之后再处理请求,写回数据使用write方法(python中是send方法)
当需要断开连接时服务端发送请求,客户端读取之后在调用close方法断开请求,
服务端read收到断开请求,服务端再调用close方法即可.
TCP客户端
首先拿到一个socket对象,调用connect方法,传入IP与PORT,发送建立链接的请求,
之后就可以进行数据交互, 如果需要结束链接,直接调用close方法即可.
基于TCP 的SOCKET服务端与客户端
基础版本
TCP是基于链接的, 必须先启动服务端,然后再启动客户端去链接服务器
import socket
import time
server = socket.socket()
# 注意: 传入的参数必须是一个元组或者列表
# ip '127.0.0.1'是本地回环地址,只能自己玩
# 如果是别的IP地址,可以在同一个局域网里一起使用
server.bind(('127.0.0.1',8080))
# 监听 半连接池为5,相当于队列中最多有5个, 超出5个就会报错
# 同时智能服务一个人
server.listen(5)
# 等待客户端的链接
# socket 是连接对象, address是客户端地址
# 以后这个服务端和客户端使用sock这个连接对象
sock,address = server.accept()
# 接收客户端发了的数据
# 传入的参数为一次接受的字节
data = sock.recv(1024)
print(f'收到了来自{address}的数据{data.decode("utf8")}')
# 服务端给客户端发送消息
data_send = f'收到了你发送的{data}'.encode('utf8')
# 注意必须传送二进制格式数据
sock.send(data_send)
time.sleep(2)
# 关闭连接对象,此时服务器没有关闭
sock.close()
# 关闭服务端
server.close()
客户端
import socket
client = socket.socket()
# 链接服务端的地址加端口
client.connect(('127.0.0.1,8080))
# 连上以后就可以发送消息了
client.send(b'good evening')
# 收到服务端