2017.07.08 Python网络编程之设定并获取默认的套接字超时时间

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 " %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()





原文地址:https://www.cnblogs.com/hqutcy/p/7136856.html