一:什么是socket(套接字)
socket是一个模块,把复杂的tcp/ip协议隐藏在socket接口后面. 位置处于应用层与tcp/ip协议通信的中间软件抽象层,是一组接口,符合socket就相当于符合了tcp/ip协议.
socket在OSI模型中的位置
二.为什么需要socket
在osi模型中 若想实现通讯 需要打通七层结构 十分繁琐
socket就是把传输层以下的协议封装起来,方便使用 只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
三.socket中两种类型
1> 基于文件类型的 AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信
2>基于网络类型的 AF_INET
socket默认指定AF_INET 因为绝大多数是基于网络通讯的
四.Python中socket
主要分为客户端和服务器
# 服务器版本
# 当成一个买手机接听电话的过程 # 接收收据可能会出错 故放在try里尝试 import socket server= socket.socket() # 买手机 server.bind(('127.0.0.1',1999)) # 插卡 指定自己地址 和 端口 默认127.0.0.1是自身地址, 端口就是一个整数 注意:这时是元祖 server.listen() # 手机监听过程 while True: client_socket,client_addr = server.accept() # 接电话 buffer_size = 1024 # 设定缓存区域 while True: try: data =client_socket.recv(1024) # 收数据 if not data: client_socket.close() # 如果没有接收到数据 意味着对方下线 就关闭通道 break print('收到了数据',data.decode('utf-8')) # 接收到的都是二进制格式 需要转化 client_socket.send(data.upper()) # 发数据 except: # 上面运行错了就运行下面的 上面没错就运行上面的下面的步骤不走了 client_socket.close() # # 如果对方下线了 那服务器也应该关闭对应的客户端对象 break
客户端版本 # 相当于买手机通话 # 发送数据和接受数据容易出错 放在try里尝试 import socket client = socket.socket() # 买个手机 # 不需要插卡 是系统自动分配地址的 故不用插卡操作 client.connect(('127.0.0.1',1999)) # 连接到ip和端口 while True: msg = input('输入内容(q退出)').strip() if msg == 'q': break if not msg: continue # 发送的顺序要和服务器相反 client.send(msg.encode('utf-8')) # 发送数据 print('sending') data = client.recv(1024) # 接受数据 print(data.decode('utf-8')) client.close() # 运行完关闭通道