1.根据netstat端口的找到进程号---->根据进程号找到进程名称-------->终止进程
1) netstat 最后一列是5432
C:UsersAdministrator> netstat -ano|findstr 8848 TCP 127.0.0.1:8848 0.0.0.0:0 LISTENING 5432
2) tasklist核实进程名称以及内存占用情况
C:UsersAdministrator>tasklist /fi "PID eq 5432" 映像名称 PID 会话名 会话# 内存使用 ========================= ======== ================ =========== ============ python.exe 5432 Console 1 10,576 K
3) taskill 终止进程
C:UsersAdministrator>tskill 5432
4) 再次查看已经消失
socket和tcp的对应关系
socket简单编程
ps:无论是服务端还是客户端,当发出send命令时,就会进入recv状态
recv(n) n代表的就是接受的最大字节数
粘包现象:
接收方没有及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)
解决方法:
服务端
import socket import subprocess import struct skt_s = socket.socket() skt_s.bind(("127.0.0.1",8888)) skt_s.listen(10) while 1: conn,addr = skt_s.accept() n = 1 while 1: try: cmd = conn.recv(1024) cmd_str = cmd.decode("utf-8") if cmd_str.upper() == "Q": break obj = subprocess.Popen(cmd_str,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) std_out = obj.stdout.read() std_err = obj.stderr.read() std = std_out + std_err std_size = len(std) std_bytes = struct.pack('i',std_size) print(std_bytes) conn.send(std_bytes) conn.send(std) print("服务器收到的第%s的回应" %n) n += 1 except ConnectionResetError: break conn.close()
客户端
import socket import struct skt_c = socket.socket() skt_c.connect(("127.0.0.1",8888)) while 1: msg = input(">>>") if msg.upper() == "Q": break if msg: skt_c.send(msg.encode("utf-8")) std_bytes = skt_c.recv(4) len_size = struct.unpack('i',std_bytes) print(len_size) total_data = b'' while len(total_data) < len_size[0]: total_data += skt_c.recv(1024) print(total_data.decode("gbk")) else: print("输入不能为空") skt_c.close()
高级版解决粘包现象:
服务端:
import subprocess import socket import json import struct srv = socket.socket() srv.bind(("127.0.0.1", 8848)) srv.listen(10) while 1: conn, addr = srv.accept() while 1: try: cmd = conn.recv(1024) cmd_str = cmd.decode("utf-8") obj = subprocess.Popen(cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) std = obj.stdout.read() + obj.stderr.read() std_len = len(std) # 结果长度封装到字典dic中 dic = {"file_size": std_len} # 将字典dic变成json格式的字符串 dic_json dic_json = json.dumps(dic) # 将dic_json字符串变成字节 dic_json_byte = dic_json.encode("utf-8") # 求下变成字节后总共有多少个长度 dic_json_byte_len = len(dic_json_byte) # 将dic_json_byte_len变成固定长度的struct格式的字节 dic_json_byte_struct = struct.pack("i", dic_json_byte_len) print(dic_json_byte_struct) # 发送前四个字节 conn.send(dic_json_byte_struct) conn.send(dic_json_byte) conn.send(std) except Exception: break conn.close()
客户端:
import struct import socket import json cli = socket.socket() cli.connect(("127.0.0.1",8848)) while True: try: cmd = input(">>>") if cmd.upper() == "Q": break elif cmd: cli.send(cmd.encode("utf-8")) dic_json_byte_struct = cli.recv(4) # 将dic_json_byte_struct变成int长度 dic_json_byte_len = struct.unpack("i",dic_json_byte_struct)[0] # 接收上步得到的长度个字节 dic_json_byte = cli.recv(dic_json_byte_len) # 变成json格式的字符串 dic_json = dic_json_byte.decode("utf-8") # 将json变成字典 dic = json.loads(dic_json) # 获取出数据的总长度 ret_size = dic["file_size"] total_data = b"" while len(total_data) < ret_size: total_data += cli.recv(1024) print(total_data.decode("gbk")) else: print("命令不能为空!") except Exception: break cli.close()