为什么学习socket必定要先学习互联网协议?python
首先C/S架构是基于网络通讯的编程
而后网络的核心即一堆网络协议,也就是协议标准。若是你想开发一款基于网络通讯的软件,就必须遵循这些标准设计模式
socket层:socket处于应用层与传输层之间,提供了一些简单的接口. 避免与操做系统之间对接,省去了至关繁琐复杂的操做.socket在python中属于一个模块.为咱们提供了这些简单的功能.网络
socket是什么?架构
socket是应用层与TCP/IP协议通讯的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来讲,一组简单的接口就是所有,让Socket去组织数据,以符合指定的协议。socket
因此,咱们无需深刻理解tcp/udp协议,socket已经为咱们封装好了,咱们只须要遵循socket的规定去编程,写出的程序天然就是遵循tcp/udp标准的。tcp
基于TCP协议的socket函数
套接字函数学习
服务端套接字函数:操作系统
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 1.服务端套接字函数 phone.bind('主机ip地址',端口号) #绑定到(主机,端口号)套接字 phone.listen() #开始TCP监听 phone.accept() #被动接受TCP客户的链接,等待链接的到来
客户端套接字函数:
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机 phone.connect() #主动链接服务端的ip和端口 phone.connect_ex() #connect()函数的扩展版本,出错的时候返回错码,而不是抛出异常
服务端和客户端的公共用途的嵌套字函数:
phone.recv() #接受TCP数据 phone.send() #发送TCP数据 phone.recvfrom() #接受UDP数据 phone.sendto() #发送UDP数据 phone.getpeername() #接收到当前套接字远端的地址 phone.getsockname() #返回指定套接字的参数 phone.setsockopt() #设置指定套接字的参数 phone.close() #关闭套接字
server:
import socket # 买电话 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 默认基于TCP协议的socket # 绑定电话卡 phone.bind(('192.168.14.198',8848)) # 绑定IP地址和端口 # 开机监听 phone.listen(5) print(111) # 等待链接 conn, addr = phone.accept() # 阻塞 print(conn,addr) from_client_data = conn.recv(1024) # 至多接受1024个字节 阻塞 print(f'来自客户端{addr[0]}的消息:{from_client_data.decode("utf-8")}') to_client_data = input('>>>') conn.send(to_client_data.encode('utf-8')) conn.close() phone.close()
client
import socket # 买电话 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 默认基于TCP协议的socket # 拨号打电话 phone.connect(('127.0.0.1',8848)) data = input('请输入>>>') phone.send(data.encode('utf-8')) from_server_data = phone.recv(1024) print(f'来自服务端的消息:{from_server_data}') # 关闭电话 phone.close()