文章目录
- 一. TCP服务端程序开发
- 二. 端口复用
- 三. 判断客户端程序是否断开
- 四. 多任务版本
一. TCP服务端程序开发
"""
主动套接字: 可以收发信息的套接字
被动套接字: 不能收发信息
TCP服务端的流程:
1. 创建socket对象
2. 绑定, 固定服务器的ip和端口
3. 设置监听, 将主动套接字变成被动套接字, 可以接收新的客户端连接,
4. 阻塞等待客户端的连接, 有客户端连接, 会返回一个新的socket, 用来和客户端通信, 原始socket会监听新的创建的socket
5. 新的socket接收信息
6. 新的socket发送信息
7. 新的socket关闭, 表示不能通信的 监听的socket 关闭了, 不能接收新的客户端连接
注意: 其中 5,6 步骤是可以重复执行的
"""
import socket
if __name__ == '__main__':
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 8355))
server_socket.listen(128)
print("服务等待连接中......")
new_socket, ip_port = server_socket.accept()
print(f"客户端{ip_port} 已经连接了......")
buf = new_socket.recv(4096)
print("接收到的信息为", buf.decode("gbk"))
send_data = "信息已经收到......".encode("gbk")
new_socket.send(send_data)
new_socket.close()
server_socket.close()
二. 端口复用
"""
问题: 在进行连接后立即执行, 会报错显示端口已经被使用
正常情况下, 服务器的代码是永远不会关闭的, 就不会出现整个问题
但是特殊情况下, 启动服务器后, 运行一次, 马上关闭再次运行, 就会出现整个bug, 端口必须要等待 30s - 2min后才能使用
解决方案:
1. 换个端口(显然不太现实, 因为客户端也需要不停的换端口)
2. 代码解决, 代码实现,让程序关闭之后, 可以立即使用整个端口, 即 端口复用
"""
import socket
if __name__ == '__main__':
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
server_socket.bind(("", 8355))
server_socket.listen(128)
print("服务等待连接中......")
new_socket, ip_port = server_socket.accept()
print(f"客户端{ip_port} 已经连接了......")
buf = new_socket.recv(4096)
print("接收到的信息为", buf.decode("gbk"))
send_data = "信息已经收到......".encode("gbk")
new_socket.send(send_data)
new_socket.close()
server_socket.close()
三. 判断客户端程序是否断开
"""
问题: 在客户端没有发送消息的情况下直接断开, 后续的代码还会继续执行
解决方案:
判断客户端程序是否已经断开
"""
import socket
if __name__ == '__main__':
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
server_socket.bind(("", 8355))
server_socket.listen(128)
print("服务等待连接中......")
new_socket, ip_port = server_socket.accept()
print(f"客户端{ip_port} 已经连接了......")
buf = new_socket.recv(4096)
if buf:
print("接收到的信息为", buf.decode("gbk"))
send_data = "信息已经收到......".encode("gbk")
new_socket.send(send_data)
else:
print(f"客户端{ip_port}已经断开连接......")
new_socket.close()
server_socket.close()
四. 多任务版本
"""
在客户端连接后会创建新的socket
"""
import socket
import threading
def handle_client_request(n_socket, client_ip_port):
while True:
buf = n_socket.recv(4096)
if buf:
print(f"接收到{client_ip_port}的信息为", buf.decode("gbk"))
send_data = "信息已经收到......".encode("gbk")
n_socket.send(send_data)
else:
print(f"客户端{client_ip_port}已经断开连接......")
break
n_socket.close()
if __name__ == '__main__':
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
server_socket.bind(("", 8355))
server_socket.listen(128)
print("服务等待连接中......")
while True:
new_socket, ip_port = server_socket.accept()
print(f"客户端{ip_port} 已经连接了......")
sub_thread = threading.Thread(target=handle_client_request, args=(new_socket, ip_port))
sub_thread.start()
server_socket.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)