• python <12> socket 编程


    1.socket编程需要两个部分 服务器与客户端我们的python中调用 socket包就不需要自己写协议了(socket编程中windows 与Linux中的效果是完全不相同了,次代码最好是放在Linux上运行)

    # _*_coding:utf-8_*_
    # /usr/bin/env python3
    # Author:book Miki
    
    
    # 服务器
    
    import socket
    server = socket.socket()  # 声明socket类型,同时生成socket连接对象
    server.bind(('localhost', 6969))   # 绑定要监听的端口此时绑定的是本地
    server.listen()  # 监听  括号里面的就是最大允许链接
    print('等待电话打进来')
    coon, addr = server.accept()  # 等待    (此时上面加一个while 就可以多个电话打进来并且进行通话)
    # coon 就是客户端连过来而在服务器端为其生成的一个连接实例
    # addr 就是地址
    print('电话打进来了')
    print(coon, addr)  # 将coon 与addr 显示出来
    while True:  # 此时就可以一直不停的发送数据了, 此时的效果就是一个电话可以无阻碍的通话
        # 如果此时没有true的话就只能接收一次了
        data = coon.recv(1024)  # 接收数据
        print('recv:', data.decode())   # 此时注意我们需要吧接收的数据解码,因为发过来的是byte类型
        coon.send(data.upper())  # 将数据里面的字母转化为大写发送
        server.close()

    2.客户端

    # _*_coding:utf-8_*_
    # /usr/bin/env python3
    # Author:book Miki
    
    # 客户端
    
    
    import socket
    client = socket.socket()  # 声明socket类型,同时生成socket连接对象
    client.connect(('localhost', 6969))  # 连接
    while True:
        ccc = input('>>:')
        if ccc == '':  # 判断是否为空
            continue
        client.send(ccc.encode('utf-8'))  # 发送byte类型
        data = client.recv(1024)   # 接收返回
        print(data.decode())  # 解码
    那下面我们可以了解一下 完整的程序了
    # _*_coding:utf-8_*_
    # /usr/bin/env python3
    # Author:book Miki
    
    
    # 第一步1.import 模块 然后实例一个模块 若是服务器的话要绑定 在监听,然后等待(返回两个值) 然后接收然后在发送
    import os
    import socket
    
    server = socket.socket()
    server.bind(('localhost', 9999))  # 绑定地址
    server.listen()  # 监听
    print('等待电话')
    while True:
        con, addr = server.accept()
        print('电话来了')
        while True:
            data = con.recv(1024)  # 接收数据
            if not data:
                print('客户端已断开')
                break
            print(data.decode())
            cmd_res = os.popen(data.decode()).read()
            con.send(str(len(cmd_res)).encode('utf-8'))
            if len(cmd_res) == 0:
                cmd_res = 'cmd_res has no thing....'
            client_re = con.recv(1024)    # 此处的精妙(隔开两个send)
            con.send(cmd_res.encode('utf-8'))  # 返回数据
        server.close()  # 关闭
    
    
    
    
    # socker粘包(两个send连在一起缓冲区) 例如
    # con.send(str(len(cmd_res)).encode('utf-8'))
    # con.send(cmd_res.encode('utf-8'))
    
    # 此时系统将两个send当作一个发。就需要在中间加一个client_re = con.recv(1024) 来等待 就可以做到
    # 也就是等到客户端确认

    2.2客户端

    # _*_coding:utf-8_*_
    # /usr/bin/env python3
    # Author:book Miki
    
    # 客户端  第一步导入模块,然后实例化一个 然后链接,然后发送 然后接收反回
    
    import socket
    
    client = socket.socket()
    client.connect(('localhost', 9999))
    while True:
        data = input('>>:').strip()
        if len(data) == 0:
            continue
        client.send(data.encode('utf-8'))
        re_size = client.recv(1024).decode()
        print(re_size)
        client.send(b'True')
        re_cmd_two = 0
        print('re_cmd_two:', type(re_cmd_two))
        print('re_size: ', type(re_size))
        print('大小为:', re_size)
        while re_cmd_two <= int(re_size):
            re_cmd_one = client.recv(1024)
            print(re_cmd_one.decode())
            re_cmd_two = re_cmd_two + len(re_cmd_one.decode())
            print(re_cmd_two)
        print(re_cmd_two)
  • 相关阅读:
    go 代理
    mongo创建用户
    博客搬家&留言板
    noip2020 SD选手迷惑行为大赏
    noip2020游记
    P4174 [NOI2006] 最大获利
    P3327 [SDOI2015]约数个数和
    P5069 [Ynoi2015]纵使日薄西山
    P3747 相逢是问候
    HDE6315 Naive Operations
  • 原文地址:https://www.cnblogs.com/BookMiki/p/9999000.html
Copyright © 2020-2023  润新知