网络编程三 Socket

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()
原文地址:https://www.cnblogs.com/duoduoyichen/p/10403698.html