一: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此时接收到一个空的数据。(只有客户端关闭 的时候,服务器会收到空数据,客户端不会发送空数据)