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

