python socket编程功能
socket编程基本思路
服务器端
- 创建socket, 绑定socket到本地IP, 端口 socket.socket(socket.AF_INET,socket.SOCK_STREAM), s.bind()
- 开始监听连接 s.listen()
- 进入循环,不断接受客户端的连接请求 s.accept()
- 然后接收传来的数据,并发送给对方数据 s.recv() , s.sendall()
- 传输完毕后,关闭socket
客户端
- 创建套接字,连接远端地址 #socket.socket(socket.AF_INET,socket.SOCK_STREAM), s.connect()
- 连接后发送数据和接收数据 #s.sendall(), s.recv()
- 传输完毕后,关闭套接字 #s.close()
1 | # 导入socket库: |
创建socket时, socket.AF_INET代表使用用IPv4协议, 如果要使用IPv6协议, 则指定sockt.AF_INET6, SOCK_STREAM指定使用面向流的TCP协议.
1 | s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n') |
socket 并发
socket默认是堵塞的, 当socket运行connect(),recv()方法时, 会堵塞直到运行完成.
1 | sock = socket.socket() |
这样做会直接抛出一个BlockingIOError的异常, 详细内容A non-blocking socket operation could not be completed immediately,
解决方法:
1 | try: |
1 | request = 'GET {} HTTP/1.0\r\nHost: xkcd.com\r\n\r\n'.format(url) |
也会抛出异常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
解决方法:
1 | while True: |
