"""一、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模块
importsocketif __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()