zoukankan      html  css  js  c++  java
  • 【Python高级编程024 ● 网络编程 ● TCP服务端程序开发】


    ---------Python基础编程---------

    Author : AI菌


    【内容讲解】

    一、TCP服务端程序开发步骤
        1、导入socket模块
        2、创建TCP套接字‘socket’
            参数1: ‘AF_INET’, 表示IPv4地址类型
            参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
        3、设置端口复用
            # 参数1: 表示当前套接字
            # 参数2: 设置端口号复用选项
            # 参数3: 设置端口号复用选项对应的值
            setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        4、绑定端口号‘bind’
            参数: 元组, 比如:(ip地址, 端口号)
        5、设置监听‘listen’
            参数: 最大等待建立连接的个数
        6、等待接受客户端的连接请求‘accept’
        7、接收数据‘recv’
            参数: 表示每次接收数据的大小,单位是字节,注意: 解码成字符串使用decode()方法
        8、发送数据‘send’
            参数: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
        9、关闭套接字‘socket’表示通信完成
    
    二、socket类的介绍
        1、导入socket模块
            import socket
        2、创建服务端socket对象
            socket.socket(AddressFamily, Type)
        3、参数说明:
            AddressFamily:表示IP地址类型, 分为TPv4和IPv6
            Type:表示传输协议类型
        4、方法说明:
            bind((host, port)):表示绑定端口号, host是ip地址,port是端口号,
                               ip地址一般不指定,表示本机的任何一个ip地址都可以
            listen (backlog):表示设置监听,backlog参数表示最大等待建立连接的个数
            accept():表示等待接受客户端的连接请求
            send(data):表示发送数据,data 是二进制数据
            recv(buffersize):表示接收数据, buffersize是每次接收数据的长度
    三、端口占用说明
    当客户端和服务端建立连接后,服务端程序退出后端口号不会立即释放,需要等待大概1-2分钟。
    解决办法有两种:
    1、更换服务端端口号
    2、设置端口号复用(推荐大家使用),也就是说让服务端程序退出后端口号立即释放。
    设置端口号复用的代码如下:
    # 参数1: 表示当前套接字
    # 参数2: 设置端口号复用选项
    # 参数3: 设置端口号复用选项对应的值
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    【代码演示】

    """
    一、TCP服务端程序开发步骤
        1、导入socket模块
        2、创建TCP套接字‘socket’
            参数1: ‘AF_INET’, 表示IPv4地址类型
            参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
        3、设置端口复用
            # 参数1: 表示当前套接字
            # 参数2: 设置端口号复用选项
            # 参数3: 设置端口号复用选项对应的值
            setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        4、绑定端口号‘bind’
            参数: 元组, 比如:(ip地址, 端口号)
        5、设置监听‘listen’
            参数: 最大等待建立连接的个数
        6、等待接受客户端的连接请求‘accept’
        7、接收数据‘recv’
            参数: 表示每次接收数据的大小,单位是字节,注意: 解码成字符串使用decode()方法
        8、发送数据‘send’
            参数: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
        9、关闭套接字‘socket’表示通信完成
    
    二、socket类的介绍
        1、导入socket模块
            import socket
        2、创建服务端socket对象
            socket.socket(AddressFamily, Type)
        3、参数说明:
            AddressFamily:表示IP地址类型, 分为TPv4和IPv6
            Type:表示传输协议类型
        4、方法说明:
            bind((host, port)):表示绑定端口号, host是ip地址,port是端口号,
                               ip地址一般不指定,表示本机的任何一个ip地址都可以
            listen (backlog):表示设置监听,backlog参数表示最大等待建立连接的个数
            accept():表示等待接受客户端的连接请求
            send(data):表示发送数据,data 是二进制数据
            recv(buffersize):表示接收数据, buffersize是每次接收数据的长度
    
    三、端口占用说明
        当客户端和服务端建立连接后,服务端程序退出后端口号不会立即释放,需要等待大概1-2分钟。
        解决办法有两种:
            1、更换服务端端口号
            2、设置端口号复用(推荐大家使用),也就是说让服务端程序退出后端口号立即释放。
            设置端口号复用的代码如下:
                # 参数1: 表示当前套接字
                # 参数2: 设置端口号复用选项
                # 参数3: 设置端口号复用选项对应的值
                tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    """

    # 1、导入socket模块 import socket if __name__ == '__main__': # 2、创建tcp服务端套接字对象 tcp_sever_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 3、设置端口号复用,通俗理解程序退出端口号立即释 # 3.1 SOL_SOCKET表示当前套接字 # 3.2 SO_REUSEADDR表示复用选项 # 3.3 是否复用,True表示复用 tcp_sever_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 4、绑定服务端端口号,"": 表示本机的任何一个ip都可以, 8989:端口号 tcp_sever_socket.bind(("", 9090)) # 5、设置监听, 128:表示最大等待的连接个数 tcp_sever_socket.listen(128) # 6、等待接收客户的连接请求 new_socket, ip_port = tcp_sever_socket.accept() print("new_socket:", new_socket) print("客户端的ip地址和端口号为:", ip_port) # 代码执行到此,说明客户端和服务端套接字建立连接成功 # 7、接收数据 recv_data = new_socket.recv(1024) # 打印接收数据的长度 print("接收数据的长度:", len(recv_data)) # 对二进制数据进行解码 recv_content = recv_data.decode("utf-8") print("接收的客户端数据:", recv_content) # 8、发送数据 # content = input("请输入你要发送的数据:") content = "我是服务端" # 对字符串进行编码 send_data = content.encode("utf-8") # 发送数据给客户端 new_socket.send(send_data) # 9、关闭套接字socket # 关闭和客户端通信的socket new_socket.close() # 服务端的套接字关闭,不在提供连接服务 tcp_sever_socket.close()

    【运行结果】

    TCP客户端程序(网络调试助手):

    作为TCP服务端的程序:

    new_socket: <socket.socket fd=524, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, 
    proto=0, laddr=('192.168.1.64', 9090), raddr=('192.168.1.235', 53696)> 客户端的ip地址和端口号为: ('192.168.1.235', 53696) 接收数据的长度: 15 接收的客户端数据: 我是客户端

    【往期精彩】

    ▷【Python基础编程196 ● 读取文件的4种方式】
    ▷【Python基础编程197 ● 读取文件的4种方式】
    ▷【Python基础编程198 ● 读取文件的4种方式】
    ▷【Python基础编程199 ● Python怎么读/写很大的文件】
    ▷【Python基础编程200 ● 读取文件的4种方式】
    ▷【Python基础编程201 ● 读取文件的4种方式】
    ▷【Python基础编程202 ● 读取文件的4种方式】
    ▷【Python基础编程203 ● 读取文件的4种方式】

    【加群交流】



  • 相关阅读:
    nrf51822蓝牙芯片ble_app_proximity程序总结
    创新学分材料
    毕业论文 一定要自己写 切记不可抄袭​
    Shell awk 求标准差
    Java程序执行Linux命令(JSP运行其他程序)
    SFTP无法连接 Connection closed by server with exitcode 127
    IE开发人员工具手册
    jQuery plugins
    Google maps api demo 2
    Google maps api demo
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/13647816.html
Copyright © 2011-2022 走看看