一:TCP客户端搭建过程:
1:创建socket套接字
2:链接服务器
3:收发数据
4:关闭套接字

import socket
def main():
	# 1:创建套接字
	tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	
	# 2:链接服务器
	server_ip = input("请输入服务器的地址:")
	server_port = input("请输入服务器的端口:")
	server_addr = (server_ip, server_port)
	tcp_socket.connect(server_addr)

	# 3:发送数据:
	send_data = input("请输入要发送的数据:")
	tcp_socket.send(send_data.encode("utf-8"))

	# 4:关闭套接字
	tcp_socket.close()


if __name__ == "__main__":
	main()

二:TCP服务器搭建流程:
服务器的特点:端口和IP地址必须绑定(固定的)
1:创建套接字(买了个手机 socket)
2:绑定本地信息(给手机插上卡 bind)
3:设置套接字主动为被动(手机为响铃模式 listen)
4:等待客户端链接(等别人打电话 accept)
5: 接收客户端发送的数据
6:返回客户端一些信息。
7:关闭两个套接字

注:监听套接字:负责监听等待客户端的链接。accept产生的套接字:负责服务客户端。

import socket

def main():
	
	# 1:创建套接字
	tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	
	# 2:绑定本地信息
	tcp_socket.bind(("192.168.24.32", 7788))
	
	# 3:设置监听状态
	tcp_socket.listen(128)
	
	# 4: 等待客户端链接
	new_socket, client_addr = tcp_socket.accept()
	print(client_addr)
	
	# 5: 接收客户端的数据:
	client_data = new_socket.recv(1024)
	print(client_data)
	
	# 6:返回给客户端数据:
	new_socket.send("hahah".encode("utf-8"))

	# 7:关闭socket套接字
	tcp_socket.close()
	new_socket.close()

if __name__ == "__main__":
	main()

三:TCP服务器循环为多个客户端服务,并且一个客户可以服务多次。

import socket

def main():
	
	# 1:创建套接字
	tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	
	# 2:绑定本地信息
	tcp_socket.bind(("192.168.24.32", 7788))
	
	# 3:设置监听状态
	tcp_socket.listen(128)
	
	while True:
	
		# 4: 等待客户端链接
		new_socket, client_addr = tcp_socket.accept()
		print(client_addr)
		
		# 5: 接收客户端的数据:
		client_data = new_socket.recv(1024)
		print(client_data)
		
		# 6:返回给客户端数据:
		new_socket.send("hahah".encode("utf-8"))
	
		# 7:关闭socket套接字
		new_socket.close()
		
	tcp_socket.close()

if __name__ == "__main__":
	main()

这个代码可以循环为多个客户端服务,但是必须等待上一个客户端服务完成,才能轮到下一个客户端服务。

import socket

def main():
	
	# 1:创建套接字
	tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	
	# 2:绑定本地信息
	tcp_socket.bind(("192.168.24.32", 7788))
	
	# 3:设置监听状态
	tcp_socket.listen(128)
	
	while True:
	
		# 4: 等待客户端链接
		new_socket, client_addr = tcp_socket.accept()
		print(client_addr)
		while True:
			
			# 5: 接收客户端的数据:
			client_data = new_socket.recv(1024)
			print(client_data)
			
			if client_data:
				# 6:返回给客户端数据:
				new_socket.send("hahah".encode("utf-8"))
			else:
				break
	
		# 7:关闭socket套接字
		new_socket.close()
		
	tcp_socket.close()

if __name__ == "__main__":
	main()

解释:外层循环是保证服务器可以服务个客户端,而内层循环是保证同一个客户端可以服务多次。
什么时间说明客户端服务完毕了呢?
答:new_socket.recv(1024):recv解阻塞有两种方式:一种是客户端发送数据过来,另一种是客户端关闭,当客户端关闭的时候,recv解阻塞,此时client此时接收到一个空的数据。(只有客户端关闭 的时候,服务器会收到空数据,客户端不会发送空数据)