• Python篇socket


    客户端向服务端获取数据实例:

    # coding: utf-8
    import time
    
    import socket
    from struct         import *
    
    def connect(host, port):
    
        # create socket
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
    
        s.settimeout(5)
    
        s.connect((host, port))
    
        return s
    
    def send(host, byte):
        s = connect(host, 7777)   # 7777 端口号
        s.sendall(byte)
        return s
    
    def recv(host, byte):
        s = send(host, byte)
    
        data = s.recv(264)
    
        return data
    
    def unpackdata(host, byte):
        data = recv(host, byte)
    
        tup = unpack('ii256s', data)
    
        return tup
    
    if __name__ == '__main__':
    
        host  = '172.30.100.40'
        param = b'uname -a'
        sendparam = param + b'\0' * (256 - len(param))
        byte  = pack('ii256s', 0, 0, sendparam)   # 第二个参数是用例编号
    
        data = unpackdata(host, byte)
    
        print('packdata = ', data)
    code

    服务器返回数据:

    packdata =  (0, 0, b'Linux localhos****(此处删除了部分字符) CST 2022 aarch64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002022-05-07 15:38:19.686194\x00\x00\x00\x00\x00\x00')

    以下是课件内容

    服务端代码:

    
    
    # coding:utf-8
    # === TCP 服务端程序 server.py ===

    from socket import *

    # 主机地址为127.0.0.1,表示绑定主机所有网络接口ip地址
    # 等待客户端来连接
    IP = '127.0.0.1'
    PORT = 50000
    #定义一次从socket缓冲区最多读入512个字节数据
    BUFLEN = 512

    # 实例化一个socket对象
    # 参数AF_INET:表示该socket网络层使用IP协议
    # 参数SOCK_STREAM:表示该socket传输层使用tcp协议
    listenSocket = socket(AF_INET, SOCK_STREAM)

    # socket绑定地址和端口
    listenSocket.bind((IP, PORT))

    # 使socket处于监听状态,等待客户端的连接请求
    # 参数5表示 最多接受多少个等待连接的客户端
    listenSocket.listen(5)
    print(f'服务端启动成功,在{PORT}端口等待客户端连接...')

    dataSocket, addr = listenSocket.accept()
    print('接受一个客户端连接: ',addr)

    while True:
    # 尝试读取对方发送的消息
    # BUFLEN 指定指定从接收缓冲里最多读取多少字节
    recved = dataSocket.recv(BUFLEN)

    # 如果返回空bytes,表示对方关闭了连接
    # 退出循环,结束消息收发
    if not recved:
    break

    # 读取的字节数据是bytes类型,需要解码为字符串
    info = recved.decode() # 编码解码需要根据实际情况,如果是音频视频,需要另外处理
    print(f'收到对方信息: {info}')

    # 发送的数据类型必须是bytes,所以要编码
    dataSocket.send(f'服务端接收到了信息{info}'.encode())


    dataSocket.close()
    listenSocket.close()
     

     客户端代码:

    # --- coding:utf-8----
    # === TCP 服务端程序 client.py ===
    from socket import *
    
    IP = '127.0.0.1'
    SERVER_PORT = 50000
    BUFLEN = 512
    
    
    dataSocket = socket(AF_INET, SOCK_STREAM)
    
    dataSocket.connect((IP, SERVER_PORT))
    
    while True:
        # 从终端读入用户输入的字符串
        toSend = input('>>> ')
        if toSend == 'exit':
            break
        dataSocket.send(toSend.encode())
    
        # 等待接收服务段的消息
        recved = dataSocket.recv(BUFLEN)
    
        if not recved:
            break
        print(recved.decode())
    dataSocket.close()
  • 相关阅读:
    建造者模式
    模板方法模式
    抽象工厂模式
    工厂方法模式
    Josephus环问题
    单例模式
    求两个数的最大公约数
    Nginx的安装与部署
    左京大夫显辅
    java 调用第三方系统时的连接代码-记录
  • 原文地址:https://www.cnblogs.com/147258llj/p/15867114.html
Copyright © 2020-2023  润新知