• 套接字及通信


    socket():先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

    socket()用法:

    socket.socket(socket_family,socket_type,protocal=0)
    socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。

    获取tcp/ip套接字
    tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    例如tcpSock = socket(AF_INET, SOCK_STREAM)

    简单的socket通信流程程序:

    客户端:

    import socket
    
    #买手机
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    
    #拨号
    phone.connect(('127.0.0.1',8050))
    
    #发、收信息
    phone.send('hello'.encode('utf-8'))
    data =phone.recv(1024)
    print(data)
    
    #关机
    phone.close()

    服务端:

    import socket
    
    #买手机
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    
    #绑定手机卡'169.254.223.212'
    phone.bind(('127.0.0.1',8050))
    
    
    #开机
    phone.listen(10)#最大挂起的连接数
    
    
    #等电话链接
    print('starting.....')
    conn,client_adder= phone.accept()
    print(conn)
    
    data=conn.recv(1024)#单位是Byte,1024是接受数据的最大数
    print('客户端的数据',data)
    conn.send(data.upper())
    
    conn.close()
    phone.close()

    简单的通信循环程序:

    客户端:

    import socket
    
    #买手机
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    
    #拨号
    phone.connect(('127.0.0.1',7100))
    
    #发、收信息
    
    while True:
        '''通信循环'''
        msg = input('>>>:').strip()
        phone.send(msg.encode('utf-8'))
        data =phone.recv(1024)
        print(data)
    
    #关机
    phone.close()

    服务端:

    import socket
    
    #买手机
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    
    #绑定手机卡'169.254.223.212'
    phone.bind(('127.0.0.1',7100))
    
    
    #开机
    phone.listen(10)#最大挂起的连接数
    
    
    #等电话链接
    print('starting.....')
    conn,client_adder= phone.accept()
    while True:
        data=conn.recv(1024)#单位是Byte,1024是接受数据的最大数
        print('客户端的数据',data)
        msg = input('>>>:').strip()
        conn.send(msg.upper().encode('utf-8'))
    
    conn.close()
    phone.close()

    模拟ssh

    客户端:(在window环境上)

    import socket
    
    #买手机
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    
    #拨号
    phone.connect(('127.0.0.1',8030))
    
    #发、收信息
    
    while True:
        '''通信循环'''
        msg = input('>>>:').strip()
        if not msg:continue
        phone.send(msg.encode('utf-8'))
        data =phone.recv(1024)
        print(data.decode('gbk'))
    
    #关机
    phone.close()

    服务器:

    import socket,subprocess
    
    #买手机
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    
    #绑定手机卡'169.254.223.212'
    phone.bind(('127.0.0.1',8030))
    
    
    #开机监听
    phone.listen(10)#最大挂起的连接数
    
    
    #等电话链接
    print('starting.....')
    while True:
        conn,client_adder= phone.accept()
        print(client_adder)
        while True:
            try:
                cmd=conn.recv(1024)#单位是Byte,1024是接受数据的最大数print('客户端的数据',data)
                print('客户端的命令', cmd)
                obj = subprocess.Popen(cmd.decode('utf-8'),
                                       shell=True,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
                stdout = obj.stdout.read()
                stderr = obj.stderr.read()
    
    
                conn.send(stdout+stderr)
            except ConnectionResetError:
                break
    
    
    
        conn.close()
    phone.close()
  • 相关阅读:
    顺序栈的模拟
    Maven安装教程详解
    C# CRC
    Oracle知识分类之常见规范
    Oracle知识分类之异常
    el-tree树结构的数据封装
    sessionStorage和localStorage
    el-form 中为el-input 添加正则校验 以及el-input正则限制
    动态组件与父子传值的灵活应用 ref控制子组件 props,emit传值
    el-tree树组件的封装 (运用递归对接口返回当前菜单数据为对象处理)
  • 原文地址:https://www.cnblogs.com/z18271397173/p/9135711.html
Copyright © 2020-2023  润新知