• python socket编程功能


    socket编程基本思路

    服务器端

    1. 创建socket, 绑定socket到本地IP, 端口 socket.socket(socket.AF_INET,socket.SOCK_STREAM), s.bind()
    2. 开始监听连接 s.listen()
    3. 进入循环,不断接受客户端的连接请求 s.accept()
    4. 然后接收传来的数据,并发送给对方数据 s.recv() , s.sendall()
    5. 传输完毕后,关闭socket

    客户端

    1. 创建套接字,连接远端地址 #socket.socket(socket.AF_INET,socket.SOCK_STREAM), s.connect()
    2. 连接后发送数据和接收数据 #s.sendall(), s.recv()
    3. 传输完毕后,关闭套接字 #s.close()
    # 导入socket库:
    import socket
    # 创建一个socket:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 建立连接:
    s.connect(('www.sina.com.cn', 80))

    创建socket时, socket.AF_INET代表使用用IPv4协议, 如果要使用IPv6协议, 则指定sockt.AF_INET6, SOCK_STREAM指定使用面向流的TCP协议.

    s.send(b'GET / HTTP/1.1
    Host: www.sina.com.cn
    Connection: close
    
    ')
    
    # 接收数据:
    buffer = []
    while True:
        # 每次最多接收1k字节:
        d = s.recv(1024)
        if d:
            buffer.append(d)
        else:
            break
    data = b''.join(buffer)
    
    # 关闭连接:
    s.close()
    
    
    # 处理数据
    header, html = response.split(b'
    
    ', 1)
    print(header.decode("utf-8"))
    print(html.decode('utf-8'))

    socket 并发

    socket默认是堵塞的, 当socket运行connect(),recv()方法时, 会堵塞直到运行完成.

    sock = socket.socket()
    #将socket设为非堵塞的self.
    sock.setblocking(False)

    这样做会直接抛出一个BlockingIOError的异常, 详细内容A non-blocking socket operation could not be completed immediately,

    解决方法:

    try:
        sock.connect(('xkcd.com', 80))
    except BlockingIOError:
        pass
    request = 'GET {} HTTP/1.0
    Host: xkcd.com
    
    '.format(url)
    encoded=request.encode('ascii')
    sock.send(encoded)

    也会抛出异常OSError: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

    解决方法:

    while True:
        try:
            sock.send(encoded)
            break  # Done.
        except OSError as e:
            pass
  • 相关阅读:
    IOS 使用动态库(dylib)和动态加载framework
    iOS 开发者应该知道的 ARM 结构
    解惑好文:移动端H5页面高清多屏适配方案
    js 单例模式的实现方式----闭包和构造函数内部判断
    解决express video 手机无法播放的问题
    前后端通吃的单元测试---mocha
    swift-ios开发pod的使用(1)
    UI 自动化测试工具BackstopJS简介(1)
    阿里妈妈-RAP项目的实践(3)
    阿里妈妈-RAP项目的实践(2)
  • 原文地址:https://www.cnblogs.com/fei-hsueh/p/6106283.html
Copyright © 2020-2023  润新知