• 【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种方式】

    【加群交流】



  • 相关阅读:
    .Net 控制台动态刷新使用
    VS 将!=转换成 ≠
    C# 自定义Html分页
    .NET MVC ModelBinder基本使用
    C# 重启电脑 程序自启动
    ASP.NET JsonResult返回日期格式及首字母大写解决
    java快速排序代码实现
    系统高可靠的设计需要考虑哪些方面
    sentinel源码学习--transport模块
    TiDB学习笔记分享--存储篇
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/13647816.html
Copyright © 2020-2023  润新知