zoukankan      html  css  js  c++  java
  • day21(套接字初应用)

    socket套接字

    服务端  (TCP)

    1 先建立套接字

    2 服务端套接字与固定端口 IP 绑定

    3 监听

    4 准备连接(accept())

    5 连接后返回 : 连接套接字  客户端地址(端口 IP)  (三次握手 四次挥手)

    6 准备接受消息 发送消息 (使用连接套接字) 每次接受成功会返回确定消息

    客户端

    1 建立套接字

    2 建立连接(目标地址)

    3 发送消息 接受消息

    客户端

    最初

    client

    from socket import *
    
    HOST = '127.0.0.1'
    PORT = 21555
    BUFSIZ = 1024
    ADDR =(HOST,PORT)
    TCP_client = socket(AF_INET,SOCK_STREAM)
    TCP_client.connect(ADDR)
    while True:
        data = input('>>>')
        if not data:
            break
        TCP_client.send(data.encode('utf-8'))
        data = TCP_client.recv(BUFSIZ)
        if not data:
            break
        print(data.decode('utf-8'))
    TCP_client.close()

    server

    import socket
    import time
    HOST = '127.0.0.1'
    PORT = 21555
    BUFSIZ = 1024
    ADDR =(HOST,PORT)
    
    TCP_Sever = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    TCP_Sever.bind(ADDR)
    TCP_Sever.listen(2)
    while True:
        print('等待连接')
        TCP_client, addr =TCP_Sever.accept()
        print('已连接',addr)
        while True:
            data = TCP_client.recv(BUFSIZ)
            print('data')
            if not data:
                break
            print(data)
            TCP_client.send('{}{}'.format(bytes(time.ctime(),'utf-8'),data).encode('utf-8'))
        TCP_client.close
    TCP_Sever.close

    解决粘包现象

    client

    from socket import *
    
    import struct
    import json
    
    cli_tcp = socket(AF_INET,SOCK_STREAM)
    cli_tcp.connect(('127.0.0.1',8086))
    while True:
        cmd = input('>>>')
        if not cmd :
            break
        cli_tcp.send(cmd.encode('utf-8'))
        hand_len = cli_tcp.recv(4) # 出错 原因 一定要收四个字节 因为 pack 'i' 转化为4 个字节
        hand_len = struct.unpack('i', hand_len)
        hand = cli_tcp.recv(hand_len[0]).decode('utf-8')
        hand_1 = json.loads(hand)
        print(hand_1)
        data_len = hand_1['len']
        print(data_len)
        r_s = 0
        while r_s < data_len:
            data = cli_tcp.recv(1024)
            # print(data)
            # print(data.decode('gbk'))
            # print(len,type(len))
            # print(len(data))
            r_s += len(data)
            print(r_s)
            # r_s = len(data)
            print(data.decode('GBK'))
    
        # recv_size=0
        # recv_data=b''
        # while recv_size < data_len:
        #     recv_data+=client.recv(1024)
        #     recv_size+=len(recv_data)
        #
        # print(recv_data.decode('utf-8'))

    server

    from socket import *
    import subprocess
    import json
    import struct
    
    
    sever_tcp = socket(AF_INET,SOCK_STREAM)
    sever_tcp.bind(('127.0.0.1',8086))
    sever_tcp.listen(5)
    while True:
        conn , addr = sever_tcp.accept()
        while True:
            cmd = conn.recv(1024)
            if not cmd:
                break
            res = subprocess.Popen(cmd.decode('utf-8'), shell=True,
                                   stdout=subprocess.PIPE,
                                   stdin=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            stderr = res.stderr.read()
            stdout = res.stdout.read()
            hand = {
                'name': 'adad',
                'len': len(stderr)+len(stdout)
            }
            hand = json.dumps(hand)
            hand_len =struct.pack('i',len(hand.encode('utf-8')))
            conn.send(hand_len)
            conn.send(hand.encode('utf-8'))
            conn.send(stderr)
            conn.send(stdout)
  • 相关阅读:
    每日日报
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    JAVA日报
  • 原文地址:https://www.cnblogs.com/lee1225/p/12686924.html
Copyright © 2011-2022 走看看