• python的socket模块以及通信相关学习笔记


    Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯(最初设计是为了是使同一台计算机中的不同进程进行信息传递通信),最后拓展到可以使网络上两台计算机的不同程序进行数据信息传递

    在这里插入图片描述

    服务端接口代码流程以及参数介绍

    # 服务端代码流程介绍
    
    # 导入模块
    import socket
    
    # 1.创建 socket 对象 设置通信方式
    # tcp方式通信,流式通信可靠,持续传输且互相确认,所谓三次握手四次挥手就是说的tcp,成功不成功可感知,不易丢包,但是占用资源多
    tcp_socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # udp方式通信,包式通信可靠性不佳,直接将信息打包成整体一次性发送,成功不成功无法感知,易丢包,但是占用资源少
    udp_socket_obj = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # family: 套接字家族可以使 AF_UNIX 或者 AF_INET。
    # type: 套接字类型可以根据是面向连接的还是非连接(tcp/udp)分为 SOCK_STREAM 或 SOCK_DGRAM。
    # protocol: 一般不填默认为 0。
    
    
    
    # 2.bind主机的ip和端口到套接字(服务端的话就是自己的ip和自己设定的通信进程程序所用的端口,客户端的话就是服务器端的ip和设定的端口)
    # bind():这个函数由服务端Socket调用,会将之前创建Socker与指定的IP地址和端口进行绑定。如果之前使用了AF_INET初始化Socket,那么这里可以使用元组(host, port) 的形式表示地址。
    #
    
    # 3.s.listen()  #开始TCP监听
    # listen():这个函数用于在使用TCP的服务端开启监听模式。这个函数可以使用个参数来指定可以挂起的最大连接数量。这个参数的值最小为1,一般设置为5。
    #
    
    # 4.s.accept()  #被动接受TCP客户的连接,(阻塞式)等待连接的到来
    # accept():这个函数用于在使用TCP的服务端接收连接,一般是阻塞态。接受TCP连接并返回(conn,adresse), 其中,conn 是新的套接字对象,可以用来接收和发送数据; address是连接客户端的地址。
    # 需要注意,当客户端不与服务端连接的话,程序会在此接口处阻塞不会往下走,除非有客户端连接到服务端
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    服务端代码样例

    import socket               # 导入 socket 模块
     
    s = socket.socket()         # 创建 socket 对象
    host = socket.gethostname() # 获取本地主机名               # 设置端口
    s.bind((host_ip, port))        # 绑定端口
     
    s.listen(5)                 # 等待客户端连接
    while True:
        c,addr = s.accept()     # 建立客户端连接
        print("来自后面所示主机的连接已建立", addr)
        # 接收消息
        client_msg=conn.recv(1024) # 收消息
        print(client_msg.decode("utf-8"))
        # 发送消息 网络传输的是二进制的对象
        c.send('欢迎访问服务端'.encode("utf-8"))
        # conn.sendall("Hello! A_dmin!!".encoding="utf-8")
        c.close()                # 关闭连接
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    s.bind() #绑定(主机,端口号)到套接字
    s.listen() #开始TCP监听
    s.accept() #被动接受TCP客户的连接,(阻塞式)等待连接的到来
    s.connect() #主动初始化TCP服务器连接
    s.connect_ex() #connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
    s.recv() #接收TCP数据
    s.send() #发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
    s.sendall() #发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
    s.recvfrom() #接收UDP数据
    s.sendto() #发送UDP数据
    s.getpeername() #连接到当前套接字的远端的地址
    s.getsockname() #当前套接字的地址
    s.getsockopt() #返回指定套接字的参数
    s.setsockopt() #设置指定套接字的参数
    s.close() #关闭套接字

    客户端代码样例

    import socket
    
    # 创建tcp,stocket对象
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 连接服务端
    phone.connect((host_ip, port))
    
    # 给服务端发消息
    phone.send('hello'.encode('utf-8'))
    
    # 接受消息
    back_msg=phone.recv(1024)
    print(back_msg)
    phone.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    参考博客链接

  • 相关阅读:
    [Dubbo3.0.8源码解析系列]-25-为调用器对象增加容错和过滤器等功能
    Postgres时间字段设置默认值
    【老生谈算法】matlab实现LU分解算法源码——LU算法
    管道实现进程间通信之命名管道
    oracle安装介绍
    ica1靶机(hydra爆破)
    自动补全:让所有终端都能自动补全 - Fig
    # SpringBoot 集成 Netty
    flutter 二维数组赋值问题
    SuperMap iServer 许可切换
  • 原文地址:https://blog.csdn.net/weixin_45668674/article/details/134520521