socket实现简单通信会话
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author cc 4 5 import socket; 6 7 ip_port = ("127.0.0.1",9998); 8 9 sk = socket.socket(); 10 sk.connect(ip_port); 11 12 while True: 13 client_input = input(">>:").strip(); 14 if client_input == "q": 15 break; 16 sk.sendall(bytes(client_input,"utf8")); 17 server_replay = sk.recv(1024); 18 print(str(server_replay,"utf8")); 19 20 sk.close();
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author cc 4 5 import socket; 6 7 ip_port = ("127.0.0.1",9998); #绑定需要开放的socket地址以及端口 8 9 sk = socket.socket(); #创建服务端的socket对象socketserver 10 sk.bind(ip_port); 11 sk.listen(5); 12 13 conn,addr = sk.accept(); #accept()函数会返回一个元组,元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号) 14 15 while True: 16 client = conn.recv(1024); #客户端输入的数据 17 #strclient = client.decode("utf8") 18 if client == "q": #判断是不是输入的q,是则退出 19 break; 20 print(str(client,"utf8")); #打印出客户端的输入 21 server_response = input("\033[31;0m>>:\033[0m").strip(); #server端输入数据 22 conn.send(bytes(server_response,"utf8")); #发送出数据并编码 23 24 conn.close();
socket 实现大数据传输
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author cc 4 5 import socket; 6 7 ip_port = ("127.0.0.1",9998); 8 9 sk = socket.socket(); 10 sk.connect(ip_port); 11 12 while True: 13 client_input = input("cmd>>:").strip(); #客户端输入一条命令 14 if len(client_input) == 0: #如果输入为空,这直接执行下一步 15 continue; 16 if client_input == "q" or client_input == "quit": #如果输入的是q或者quit,则退出 17 break; 18 sk.sendall(bytes(client_input,"utf8")); #给服务端发送这条命令 19 server_ask_msg = sk.recv(100); #接到服务器端返回的数据 20 cmd_res_msg = str(server_ask_msg.decode()).split("|"); #处理服务器发送过来的数据 21 print("server response:",cmd_res_msg); #打印需要处理的字符串大小 22 if cmd_res_msg[0] == "CMD_REPONSE_SIZE": #判断服务端收到的数据 23 cmd_res_size = int(cmd_res_msg[1]); #将数据转成int格式 24 sk.send(b"CLIENT_READY_TO_RECV"); #发送一串字符串给客户端 25 res = ''; 26 received_size = 0; 27 while received_size < cmd_res_size: #定义一个循环,接收的数据小于总数据,则进行下一步,否则打印结果 28 server_replay = sk.recv(1024); 29 received_size += len(server_replay); 30 res += str(server_replay.decode()); 31 else: 32 print(str(res)); 33 print("----recv done----") 34 #break; 35 36 sk.close();
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author cc 4 5 import socket; 6 import subprocess; 7 ip_port = ("127.0.0.1",9998); #绑定需要开放的socket地址以及端口 8 9 sk = socket.socket(); #创建服务端的socket对象socketserver 10 sk.bind(ip_port); 11 sk.listen(5); 12 while True: 13 print("等待客户端链接..."); 14 conn, addr = sk.accept(); # accept()函数会返回一个元组,元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号) 15 print("新连接:",addr); 16 while True: 17 client_data = conn.recv(1024); #客户端输入的数据 18 if not client_data: #如果客户端输入为空,则跳过 19 continue; 20 cmd = str(client_data,"utf8") #收到客户端的命令并赋值给cmd 21 print("命令:",cmd); #打印数来 22 cmd_client = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) #将收到的命令,用subprocess利用管道给系统处理 23 cmd_reponse = cmd_client.stdout.read(); #接收到系统处理的数据 24 if len(cmd_reponse) == 0: #如果客户端输入的没有返回数据,比如cd之类的命令,则返回下面一句话,不然socket会等待处理,进程会卡死 25 cmd_reponse = b"cmd execution has no output..."; 26 ask_msg = bytes("CMD_REPONSE_SIZE|%s" % len(cmd_reponse),"utf8"); #将客户端发送过来的数据以一段字符串加字符串长度返回给客户端 27 conn.send(ask_msg); #发送数据 28 client_ask = conn.recv(50); #接收客户端的数据 是CLIENT_READY_TO_RECV 这一条的作用是防止,上面的字符串和下面的服务端返回结果一起发给客户端。 29 if client_ask.decode() == "CLIENT_READY_TO_RECV": #判断刚接收的数据 30 conn.send(cmd_reponse); #发送出数据并编码 31 32 conn.close();