路飞学城Python-Day27(复习)

简单的socket通信

import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
msg = input('>>>').strip()
client.send(msg.encode('gbk'))
res = client.recv(1024)
print(res)
client.close()
客户端
import socket
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.bind(('127.0.0.1', 8080))
sk.listen(5)
conn, addr = sk.accept()
res = conn.recv(1024)
conn.send(res.upper())
conn.close()
sk.close()
服务端

聊天版socket通信

import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
while True:
    msg = input('发送信息>>>').strip()
    client.send(msg.encode('gbk'))
    re = client.recv(1024)
    print('接收到的消息%s'%(re.decode('gbk')))
聊天版客户端
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
    conn,addr = server.accept()
    while True:
        try:
            msg = conn.recv(1024)
            print('接收到客户端的信息%s'%(msg.decode('gbk')))
            re = input('请回复信息>>>').strip()
            conn.send(re.encode('gbk'))
        except ConnectionResetError:
            pass
聊天版服务端

粘包版socket通信

import socket
import struct
import pickle
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
while True:
    msg = input('请输入发送的消息>>>').strip()
    msg_dict = {
        'msg':msg
    }
    msg_p = pickle.dumps(msg_dict)
    client.send(struct.pack('i',len(msg_p)))
    res = pickle.loads(client.recv(1024))
    if res['confirm']:
        client.send(msg.encode('gbk'))
    else:
        pass
粘包版客户端
import socket
import struct
import pickle
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
    conn, addr = server.accept()
    while True:
        res = conn.recv(4)
        receive_bytes = struct.unpack('i',res)[0]
        if receive_bytes<1024:
            msg = {
                'confirm': True,
            }
            msg_p = pickle.dumps(msg)
            conn.send(msg_p)
            res = conn.recv(1024)
            print(res.decode('gbk'))
        else:
            msg = {
                'confirm':False,
            }
            msg_p = pickle.dumps(msg)
            conn.send(msg_p)
粘包版服务端

 写一个异常

try:
    int_number = int(input('请输入一个整数').strip())
    print(int_number)
except Exception as e:
    print(e)
写一个异常

自定义异常

class E(BaseException):
    def __init__(self):
        err = '发生异常了!'
        BaseException.__init__(self,err)
raise E
自定义异常

 windows系统版客户端和服务端

import socket
import pickle
import struct
import subprocess
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
while True:
    command = input('请输入命令>>>').strip()
    msg_dict = {
        'msg':command
    }
    msg = pickle.dumps(msg_dict)
    client.send(struct.pack('i', len(msg)))
    res = client.recv(1024)
    if pickle.loads(res)['confirm']:
        client.send(command.encode('gbk'))
    #     解析长度
        res_len = client.recv(4)
        cmd_len = struct.unpack('i',res_len)[0]
    #       接收结果
        fin_res = client.recv(cmd_len).decode('gbk')
        print(fin_res)
    else:
        print('超出字符限制,请重试!')
(系统命令版)客户端
import socket
import pickle
import struct
import subprocess
# a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
# print(a.stdout.read().decode('gbk'))
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
    conn, addr = server.accept()
    while True:
        try:
            res = conn.recv(4)
            res_bytes = struct.unpack('i',res)[0]
            if res_bytes<1024:
                msg = {
                    'confirm':True,
                }
                conn.send(pickle.dumps(msg))
                cmd = conn.recv(1024).decode('gbk')
                cmd_res = subprocess.Popen(
                    cmd,
                    shell= True,
                    stdout= subprocess.PIPE,
                    stderr= subprocess.PIPE
                )
                res_cmd = cmd_res.stdout.read()
            #     发送长度
                conn.send(struct.pack('i',len(res_cmd)))
            #     发送结果
                conn.send(res_cmd)
            else:
                msg = {
                    'confirm': False,
                }
                conn.send(pickle.dumps(msg))

        except Exception as e:
            print(e)
            break
(系统命令版)服务端
Win a contest, win a challenge
原文地址:https://www.cnblogs.com/pandaboy1123/p/9370692.html