9.当客户端的套接字调用close后.服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过 返回数据的长度来区别客户端是否已经下线。
tcp应用案例示例1-为一个用户办理一次业务:
"""可以理解为银行一个客服为排队的人员办理业务""" import socket def main(): # 1.创建tcp套接字 tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.绑定本地信息 tcp_service_socket.bind(('', 8080)) # 3.让默认的套接字由主动变为被动 tcp_service_socket.listen(128) while 1: # 4.等待客户端的链接 new_client_socket, client_addr = tcp_service_socket.accept() print("链接的客户端地址为:", client_addr) # 接收客户端发送过来的请求 recv_data = new_client_socket.recvfrom(1024) print(recv_data) # 给客户端回送消息 new_client_socket.send("hahahah".encode("utf-8")) # 关闭套接字 new_client_socket.close() tcp_service_socket.close() if __name__ == '__main__': main()示例2-为同一用户服务多次并判断一个用户是否服务完毕:
"""可以理解为银行一个客服为排队的人员办理业务""" import socket def main(): # 1.创建tcp套接字 tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.绑定本地信息 tcp_service_socket.bind(('', 8080)) # 3.让默认的套接字由主动变为被动 tcp_service_socket.listen(128) while 1: # 4.等待客户端的链接 new_client_socket, client_addr = tcp_service_socket.accept() print("链接的客户端地址为:", client_addr) # 循环目的:为同一个客户服务多次 while 1: # 接收客户端发送过来的请求 recv_data = new_client_socket.recvfrom(1024) print(recv_data) # 如果recv解堵塞,那么有两种方式 # 1.客户端发了数据过来 # 2.客户端调用了close if recv_data: # 给客户端回送消息 new_client_socket.send("hahahah".encode("utf-8")) else: break # 关闭套接字 new_client_socket.close() tcp_service_socket.close() if __name__ == '__main__': main()示例3-tcp文件下载客户端和服务端:
文件下载客户端
import socket def main(): # 1.创建套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.获取服务器的ip,port dest_ip = input("请输入你要链接的服务器ip:") dest_port = input("请输入你要链接的端口:") # 3.链接服务器 tcp_socket.connect((dest_ip, dest_port)) # 4.获取下载的文件名字 want_file = input("请输入你要下载的文件:") # 5.将文件名字发送到服务器 tcp_socket.send(want_file.encode("utf-8")) # 6.接收要下载的文件 file_data = tcp_socket.recv(1024) # 7.将接收文件的数据写入一个文件中 if file_data: with open("[复件]" + want_file, "wb") as f: f.write(file_data) # 8.关闭套接字 tcp_socket.close() pass if __name__ == '__main__': main()文件下载服务端
import socket def send_file2client(new_socket, client_addr): # 1.接受客户端发送过来的 要下载的文件名 want_file = new_socket.recv(1024).decode("utf-8") print("客户端 %s 要接收的文件为:%s" % (str(client_addr), want_file)) # 2.读取文件数据 file_data = None try: f = open(want_file, "rb") file_data = f.read() f.close() except Exception as e: print("你要下载的文件 %s 不存在" % want_file) # 3.发送文件的数据给客户端 if file_data: new_socket.send(file_data) def main(): # 1.创建套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.绑定本地信息 tcp_socket.bind(('', 8080)) # 3.套接字被动接受 listen tcp_socket.listen(128) while 1: # 4.等待客户端的链接 accept new_socket, client_addr = tcp_socket.accept() # 5.调用函数发送文件到客户端 send_file2client(new_socket, client_addr) # 7.关闭套接字 new_socket.close() tcp_socket.close() if __name__ == '__main__': main()Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx