zoukankan      html  css  js  c++  java
  • 网络编程三 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()
    
  • 相关阅读:
    解决chrome console打印的信息一闪而过
    Docker 构建自定义镜像
    Docker 镜像、容器、仓库
    Docker 简介、下载安装
    执行yum list installed | grep xxx 命令时报错:未提供依赖perl-DBD-SQLite、perl-DBI
    SpringBoot 配置多种运行环境
    SpringCloud Config 分布式配置管理
    SpringCloud Sleuth+Zipkin 分布式链路追踪
    Dubbo 配置中心、元数据中心
    dubbo admin的使用
  • 原文地址:https://www.cnblogs.com/duoduoyichen/p/10403698.html
Copyright © 2011-2022 走看看