这里还是使用iphone模拟客户端进行操作
单人版服务端程序
代码实现
import socket
if __name__ == '__main__':
# 1、创建tcp服务端套接字
# AF_INET:IPv4地址类型
# SOCK_STREAM:tcp传输协议类型
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定端口号
# "":第一个参数表示ip地址,一般不用指定则表示本机任何一个ip
# 9090:第二个参数表示端口号
tcp_server_socket.bind(("", 9999))
# 3、设置监听
# 128:表示最大等待建立连接的个数
tcp_server_socket.listen(128)
# 4、等待接收客户端的连接请求
# 注意点:每次当客户端和服务端建立连接成功都会返回一个新的套接字;
# tcp_server_socket套接字只是负责等待接收客户端的连接请求,收发数据不使用该套接字
new_client, ip_port = tcp_server_socket.accept()
print("客户端的ip和端口号为:", ip_port)
# 5、接收客户端的数据
# 收发数据都是使用返回的这个新的套接字
recv_data = new_client.recv(1024)
# 对二进制的数据进行解码变成字符串
recv_content = recv_data.decode("utf-8")
print("接收到客户端的数据为:", recv_content)
# 6、发送数据到客户端
send_content = "服务端正在维护中..."
# 对字符串数据进行编码
send_data = send_content.encode("utf-8")
# 发送
new_client.send(send_data)
# 关闭服务与客户端套接字,表示和客户端终止通信
new_client.close()
# 7、关闭服务端套接字,表示服务端不再等待接收客户端的连接请求(维护中)
tcp_server_socket.close()
run运行代码
客户端连接服务端,即可看见控制台(服务端)打印出客户端信息;
接着发送信息到服务端
多人版服务端程序(服务于多个客户端)
代码实现
import socket
import threading
# 处理客户端请求的任务函数
def handle_client_request(ip_port, new_client):
print("客户端的ip和端口号为:", ip_port)
# 5、接收客户端的数据
# 收发数据都是使用返回的这个新的套接字
# 循环接收客户端的数据
while True:
recv_data = new_client.recv(1024)
# 判断此容器如果接受到了数据
if recv_data:
print("接受到的数据长度是:", len(recv_data))
# 对二进制的数据进行解码变成字符串
recv_content = recv_data.decode("utf-8")
print("接收到客户端的数据为:", recv_content, "客户端的IP端口为:", ip_port)
# 6、发送数据到客户端
send_content = "服务端正在维护中..."
# 对字符串数据进行编码
send_data = send_content.encode("utf-8")
# 发送
new_client.send(send_data)
# 如果没有接受到数据则表示客户端关闭连接,此时则服务端也向客户端关闭连接break
else:
print("客户端已关闭连接,下线了,此客户端的ip端口为:", ip_port)
break
# 关闭服务与客户端套接字,表示和客户端终止通信
new_client.close()
if __name__ == '__main__':
# 1、创建tcp服务端套接字
# AF_INET:IPv4地址类型
# SOCK_STREAM:tcp传输协议类型
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用:服务端程序退出后立即释放端口
# SOL_SOCKET:表示当前套接字
# SO_REUSEADDR:表示复用端口号的选项
# True:确定复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2、绑定端口号
# "":第一个参数表示ip地址,一般不用指定则表示本机任何一个ip
# 9090:第二个参数表示端口号
tcp_server_socket.bind(("", 9999))
# 3、设置监听
# 128:表示最大等待建立连接的个数
tcp_server_socket.listen(128)
# 4、等待接收客户端的连接请求
# 注意点:每次当客户端和服务端建立连接成功都会返回一个新的套接字;
# tcp_server_socket套接字只是负责等待接收客户端的连接请求,收发数据不使用该套接字
# 循环等待接受客户端的连接请求
while True:
new_client, ip_port = tcp_server_socket.accept()
# 当客户端和服务端建立连接成功,创建一个子线程专门负责接受客户端的数据
sub_thread = threading.Thread(target=handle_client_request, args=(ip_port, new_client))
# 设置守护主线程,主线程退出子线程直接销毁
sub_thread.setDaemon(True)
# 启动子线程执行对应的任务
sub_thread.start()
# 7、关闭服务端套接字,表示服务端不再等待接收客户端的连接请求(维护中)
# 因为服务端的程序需要一直运行,所以关闭服务端套接字的代码可以省略不写
#tcp_server_socket.close()
运行代码
客户端点击连接,可以一直不停的发送数据,服务端也可以一直接受;
当客户端断开连接时,服务端则也断开
服务端退出
客户端与服务端建立连接后,当服务端代码直接退出,主进程退出则子进程直接销毁