342-TCP服务器开发流程

CS模式:客户端-服务端模式

400

TCP客户端开发流程介绍(五步)(C端)
1.创建客户端套接字对象
2.和服务端套接字建立连接
3.发送数据
4.接收数据
5.关闭客户端套接字
TCP服务端开发流程(七步)(S端)
1.创建服务端端套接字对象
2.绑定端口号
3.设置监听
4.等待接受客户端的连接请求
5.接收数据
6.发送数据
7.关闭套接字

TCP客户端程序开发

import socket

# 第一步:创建客户端套接字对象
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # socket.AF_INET表示IPV4,socket.SOCK_STREAM表示TCP协议

# 第二步:创建连接
tcp_client_socket.connect(("127.0.0.1", 8000))  # 参数是个元组

# 第三步:发送数据到服务器端
tcp_client_socket.send("hello".encode("utf-8"))  # 这里将字符串编码成二进制数据

# 第四步:接收服务器端返回的数据
recv_data = tcp_client_socket.recv(1024).decode("utf-8")  # 1024表示本次接收的最大字节数,decode解码
print(f"接收到的数据为:{recv_data}")  # 将二进制数据解码成字符串

# 第五步:关闭套接字对象
tcp_client_socket.close()

tip:发送和接受的都要是二进制数据,所以要用encode和decode方法将字符串转换成二进制数据

关于socket.AF_INET、socket.SOCK_STREAM常量的介绍:

TCP服务端程序开发(重点)

开发的七步:
1.创建服务端套接字对象
2.绑定端口号
3.设置监听
4.等待接受客户端的连接请求:类似于input() → accept()阻塞
5.接收数据
6.发送数据
7.关闭套接字

服务器如何判断是哪个客户端连接:
通过accept()方法返回的套接字对象来区分不同的客户端

import socket

# 1.创建服务端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # socket.AF_INET表示IPV4,socket.SOCK_STREAM表示TCP协议

# 2.绑定端口号
tcp_server_socket.bind(("127.0.0.1", 8000))  # 如果是本机,可以不写ip地址

# 3.设置监听
tcp_server_socket.listen(128)  # 128表示最大连接数

# 4.等待接受客户端的连接请求
new_socket, ip_port = tcp_server_socket.accept()  # 阻塞状态,等待客户端连接
# tcp_server_socket对象主要用于接收客户端连接:绑定端口、设置监听、接收连接
# new_socket对象主要用于接收和发送数据
print(f"新连接的客户端地址为:{ip_port}")
print(f"新连接的客户端socket对象为:{new_socket}")

# ================================================
# 5.接收数据
recv_data = new_socket.recv(1024).decode("utf-8")  # 1024表示本次接收的最大字节数,decode解码	
print(f"接收到的数据为:{recv_data}")

# 6.发送数据
new_socket.send("信息已收到".encode("utf-8"))  # 将字符串编码成二进制数据

# 7.关闭新套接字对象(关闭后不能收发消息)和服务端套接字对象(不能接收新连接)
new_socket.close()
tcp_server_socket.close()

当客户端发送信息后,接收到的data是一个元组,下面是个栗子,元组有两个元素,第一个元素是套接字对象,第二个元素是客户端的地址(也是元组)

(
	<socket.socket fd=432, family=AddressFamily.AF_INET, ttype=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 60925)>, 
	('127.0.0.1', 60925)
)

注意事项:

服务器端面向对象版本

都是七步,不变

面向对象,先分析有哪些对象,创建类,属性和方法


# 第一步:创建类
class WebServer:
	# 第四步:创建初始化方法,初始化套接字对象
	def __init__(self):
		# 1.创建套接字对象
		self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # AF_INET表示IPV4,SOCK_STREAM表示TCP协议

		# 2.绑定ip和端口号
		self.tcp_server_socket.bind(("127.0.0.1", 8000))  # 如果是本机,可以不写ip地址
		# 这里的8000端口不会随着服务器关闭而释放,需要设置端口复用,端口复用在下一篇笔记

		# 3.设置监听
		self.tcp_server_socket.listen(128)  # 128表示最大连接数

	# 第五步:定义一个start方法,启动服务器,接收客户端连接
	def start(self):
		while True:
			# 4.等待接受客户端的连接请求
			new_socket, ip_port = self.tcp_server_socket.accept()

			# 5.接收数据
			recv_data = new_socket.recv(1024).decode("utf-8")
			print(f"接收到的数据为:{recv_data}")

			# 6.发送数据
			new_socket.send("信息已收到".encode("utf-8"))

			# 7.关闭套接字(只能接收一次信息)
			# 不能关闭tcp_server_socket,否则无法继续接收新连接
			new_socket.close()

			# 目前一次只能接收一个客户端,因为是单进程
			# 如果希望服务器可以同时和多个客户端收发消息,需要多进程(多任务编程)

# 第二步:实例化对象
ws = WebServer()

# 第三步:调用start方法,启动服务器,接收客户端连接
ws.start()