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