1. 设定并获取默认的套接字超时时间:
- # -*- coding: UTF-8 -*-
- # 有时候你需要处理 socket 库某些属性的默认值, 例如套接字超时时间
- # !usr/bin/env python
- # Python Network Programming Cookbook --Chapter -1
- # This program is optimized for Python 2.7
- # It may run on any other version with/without modifications
- import socket
- def test_socket_timeout():
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- print "默认套接字超时时间是:%s" %s.gettimeout()
- s.settimeout(100)
- print "现在套接字的超时时间是:%s" %s.gettimeout()
- if __name__=='__main__':
- test_socket_timeout()
运行程序遇到问题: No py.test runner found in selected interpreter
解决办法: 没有找到 py.test 文件, 给 pycharm 软件管理员权限运行, 然后安装 pytest 包, pip install pytest
结果如下:
2. 优雅的处理套接字错误:
- # -*- coding: UTF-8 -*-
- # 编写几个 try-except 代码块, 每个代码块对应一种可能发生的错误
- # !usr/bin/env python
- # Python Network Programming Cookbook --Chapter -1
- # This program is optimized for Python 2.7
- # It may run on any other version with/without modifications
- import socket
- import sys
- import argparse
- def main( ):
- parser=argparse.ArgumentParser(description='socket Error Example')
- parser.add_argument('--host',action="store",dest="host",required=False)
- parser.add_argument('--port',action="store",dest="port",type=int,required=False)
- parser.add_argument('--file',action="store",dest="file",required=False)
- given_args=parser.parse_args()
- host=given_args.host
- port=given_args.port
- filename=given_args.file
- try:
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- except socket.error,e:
- print "发生错误当创建 sock 对象时:%s" %e
- sys.exit(1)
- try:
- print host,port
- s.connect((host,port))
- except socket.gaierror,e:
- print "连接服务器时地址释放发生错误:%s" %e
- sys.exit(1)
- except socket.error,e:
- print "连接发生错误:%s" %e
- sys.exit(1)
- try:
- s.sendall("GET %s HTTP/1.0\r\n\r\n" %filename)
- except socket.error,e:
- print "发送数据时发生错误:%s" %e
- sys.exit(1)
- while 1:
- try:
- buf=s.recv(2048)
- except socket.error,e:
- print "接收数据发生错误:%s" %e
- sys.exit(1)
- if not len(buf):
- break
- sys.stdout.write(buf)
- if __name__=='__main__':
- main()
3. 修改套接字发送和接收的缓存区大小:
- # -*- coding: UTF-8 -*-
- # 默认的套接字缓冲区大小可能不够用, 此时可以将默认的套接字缓冲区大小改成一个更合适的值
- # !usr/bin/env python
- # Python Network Programming Cookbook --Chapter -1
- # This program is optimized for Python 2.7
- # It may run on any other version with/without modifications
- import socket
- SEND_BUF_SIZE=4096
- RECV_BUF_SIZE=4096
- def modify_buf_size():
- sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- bufsize=sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
- print "缓冲区之前的大小:%d" %bufsize
- sock.setsockopt(socket.SOL_TCP,socket.TCP_NODELAY,1)
- sock.setsockopt(
- socket.SOL_SOCKET,
- socket.SO_SNDBUF,
- SEND_BUF_SIZE
- )
- sock.setsockopt(
- socket.SOL_SOCKET,
- socket.SO_RCVBUF,
- RECV_BUF_SIZE
- )
- bufsize=sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
- print "修改后缓冲区大小是:%d" %bufsize
- if __name__=='__main__':
- modify_buf_size()
4. 把套接字改为阻塞或非阻塞模式: 默认情况下, TCP 套接字处于阻塞模式中, 也就是说, 除非完成了某项操作, 否则不会把控制权交还给程序
例如: 调用 connect()API 后, 连接操作会阻止程序继续往下执行, 直到连接成功为止
很多情况下, 你并不想让程序一直等待服务器响应或者有异常终止操作
- # -*- coding: UTF-8 -*-
- # 在 Python 中, 套接字可以被设置为阻塞模式或非阻塞模式,
- # 在非阻塞模式下, 调用 API 后, 例如 send() 或 recv() 方法如果遇到问题就会抛出异常,
- # 但在阻塞模型下, 遇到问题并不会阻止操作
- # !usr/bin/env python
- # Python Network Programming Cookbook --Chapter -1
- # This program is optimized for Python 2.7
- # It may run on any other version with/without modifications
- import socket
- def test_socket_modes():
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- s.setblocking(1)
- s.settimeout(0.5)
- s.bind(("127.0.0.1",0))
- socket_address=s.getsockname()
- print "服务器登录 socket:%s" %str(socket_address)
- while(1):
- s.listen(1)
- if __name__=='__main__':
- test_socket_modes()
来源: http://www.92to.com/bangong/2018/06-10/33899123.html