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

 

 
        

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM