ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Python高级编程025 ● 网络编程 ● 开发TCP网络程序注意点】

2020-09-11 11:01:22  阅读:191  来源: 互联网

标签:socket Python 编程 网络 复用 参数 端口号 接收数据 服务端



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

 

【加群交流】



标签:socket,Python,编程,网络,复用,参数,端口号,接收数据,服务端
来源: https://www.cnblogs.com/hezhiyao/p/13650462.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有