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

 

【加群交流】



posted @ 2020-09-10 19:42  AI菌  阅读(255)  评论(0编辑  收藏  举报