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


    socket套接字

    1. 为何学习socket一定要先学习互联网协议?

      • 首先C/S架构是基于网络通信的

        然后网络的核心即一堆网络协议,也就是协议标准。如果你想开发一款基于网络通信的软件,就必须遵循这些标准

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

    1. socket是什么?

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

        所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

    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()
        
  • 相关阅读:
    Python十大经典算法之选择排序
    在js中修改样式带 !important 的样式
    vscode 使用 ejs 语法有红色错误提示线
    mysql 报 'Host ‘XXXXXX’ is blocked because of many connection errors'
    字符编码
    Canal.adapter报错
    Windows 域控配置时间同步
    Docker清理日志脚本
    Docker快速部署clickhouse
    Windows批处理一键添加hosts文件
  • 原文地址:https://www.cnblogs.com/zhangdadayou/p/11431795.html
Copyright © 2020-2023  润新知