---------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种方式】
【加群交流】