socket
什么是socket 翻译为套接字
是一套编程接口,内部封装了一堆底层协议,隐藏了内部复杂的实现细节,提供简单的使用接口
咱们只要按照socket编程接口来编写出的代码,就已经遵循了各种协议
简单的说就是一个封装好的模块
要学习的就是模块的使用方法
socket的发展
最开始socket使用来完成进程间通讯的,并不是用来网络通讯,那时候还没有网络
后来有了网络之后 .基于之前的socket来进行了更新 使其可以支持网络通讯
所以socket分为两种类型
AF_UNIX : 进程间通讯
AF_INET : 网络通讯
socket在OSI中的位置
import socket # 作为服务器必明确自己的ip和端口号 并且不应该变化 # 参数1指定 socket类型AF_INET 表示网络类型 #参数2指定的传输协议为 SOCK_STREAM表示TCP协议 SOCK_DGRAM UDP协议 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 1.买电话机 # 默认就是网络类型 TCP协议 #server = socket.socket() # 127.0.0.1这叫回送地址 表示当前电脑本身 # ip一定本机ip 本机可能会有多个IP (无线|有限) # 注意:需要参数是一个元组 端口就是普通整数 server.bind(("127.0.0.1",1688)) # 2.插入手机卡 # 无论是服务器端还是客户端 都是socket 类型 # 开始监听1688端口 盯着这个端口看以后没有数据过来 server.listen() # 3.手机开始待机 # 接收链接请求 # 第一个是表示客户端的socket 第二个客户端的地址信息
while True:
client_socket,client_addr = server.accept()
buffer_size = 1024 #缓冲区 就是一个临时的容器
while True:
try:
data = client_socket.recv(1024) #缓冲区大小 不能随便写 太大会导致内存溢出 太小效率低 在内存能够承受的情况下 大一些
# 在linux中 对方如果强行下线了 服务器不会抛出异常 只会收到空消息
# 得加上判断 如果为空则意味着 对方下线了 应该关闭链接 跳出循环
# windows上正常关闭 也会收到空消息 if 必须要加
if not data:
client_socket.close()
break
print(data.decode("utf-8")) # 解码时必须保证双方同意编码方式
# 转为大写在发回去
client_socket.send(data.upper())
except ConnectionResetError as e:
print("%s %s" % (client_addr[0],client_addr[1]),e)
# 如果对方下线了 那服务器也应该关闭对应的客户端对象
client_socket.close()
break
# 通常服务器不会关闭
# server.close()
import socket # 买个电话 client = socket.socket() # 作为客户端 ip和端口可以变化 所有系统会自动分配随机端给客户端 client.connect(("127.0.0.1",1688)) # 添加循环 用来重复收发数据 while True: # 收发的顺序 必须很对面相反 否则卡死了 # 开始通话 # 发送数据 注意发送的内容只能是二进制 bytes client.send("hello".encode("utf-8")) # 接收数据 单位为字节 data = client.recv(1024) print(data) client.close()