Python之网络编程(二)Socket套接字

socket套接字

  1. 为什么学习socket必定要先学习互联网协议?python

    • 首先C/S架构是基于网络通讯的编程

      而后网络的核心即一堆网络协议,也就是协议标准。若是你想开发一款基于网络通讯的软件,就必须遵循这些标准设计模式

  2. socket层:socket处于应用层与传输层之间,提供了一些简单的接口. 避免与操做系统之间对接,省去了至关繁琐复杂的操做.socket在python中属于一个模块.为咱们提供了这些简单的功能.网络

  1. socket是什么?架构

    • socket是应用层与TCP/IP协议通讯的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来讲,一组简单的接口就是所有,让Socket去组织数据,以符合指定的协议。socket

      因此,咱们无需深刻理解tcp/udp协议,socket已经为咱们封装好了,咱们只须要遵循socket的规定去编程,写出的程序天然就是遵循tcp/udp标准的。tcp

  2. 基于TCP协议的socket函数

    • 套接字的分类:
      • 基于文件类型的套接字家族:AF_UNIX(在Unix系统上,一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程同时运行在同一机器,能够经过访问同一个文件系统间接完成通讯)
      • 基于网络类型的套接字家族:AF_INET (python支持不少种地址家族,可是因为咱们只关心网络编程,因此大部分时候咱们只使用AF_INET)
    • 套接字的工做流程:
      • 例子:若是你要给你的一个朋友打电话,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就创建起了链接,就能够讲话了。等交流结束,挂断电话结束这次交谈。 生活中的场景就解释了这工做原理。
  3. 套接字函数学习

    • 服务端套接字函数:操作系统

      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()
相关文章
相关标签/搜索