python網路編程學習筆記(5):socket的一些補充

來源:互聯網
上載者:User

1、半開放socket
利用shutdown()函數使socket雙向資料轉送變為單向資料轉送。shutdown()需要一個單獨的參數,該參數表示了如何關閉socket。具體為:0表示禁止將來讀;1
表示禁止將來寫;2表示禁止將來讀和寫。
2、timeouts控制逾時
調用socket的settimeout()函數,向其傳遞參數,表明逾時時間設定。當訪問一個socket,如果經過了參數設定的時間後,什麼都沒有發生,則會產生一個socket.timeout異常。
例如:當程式運行後,會等待資料傳入。在另一終端,利用telnet串連12345連接埠。串連成功後,顯示“串連來自:****”,如果此時5秒內,終端未進行輸入,系
統會提示連線逾時退出。
代碼如下:

# -*- coding: cp936 -*-##tcp響應伺服器import socket,tracebackhost=''port=12345s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)s.bind((host,port))s.listen(1)while 1:    try:        clientsock,clientaddr=s.accept()    except KeyboardInterrupt:        raise    except:        traceback.print_exc()        continue    clientsock.settimeout(5)    try:        print "串連來自:",clientsock.getpeername()        while 1:            data=clientsock.recv(4096)            if not len(data):                break            clientsock.sendall(data)            clientsock.sendall("\nI get it!\n")##            t=raw_input('input the word:')##            clientsock.sendall(t)    except (KeyboardInterrupt,SystemExit):        raise    except socket.timeout:        print '連線逾時'        pass    except:        traceback.print_exc()    try:        clientsock.close()    except KeyboardInterrupt:        raise    except:        traceback.print_exc()

3、理解網路位元組順序
不同的平台有不同的位元據編碼方法,為瞭解決這一總是,一種標準的位元據標記法,稱為網路位元組順序。在發送一個二進位整數之前,該整數首先被
轉換成網路位元組順序。接收方收到後,在使用該資料之前,會先把網路位元組順序轉換成本地的表示方法。
python的struct模組提供了把資料在python和位元據之間轉換的支援。
主要的兩種基本格式:
H:適用於16位整數
I:適用於32位整數
驚歎號表示struct模組使用網路位元組順序來進行編碼和解碼。其它的格式見下表:

Character

Byte order

Size and alignment

@

native

native            湊夠4個位元組

=

native

standard        按原位元組數

<

little-endian

standard        按原位元組數

>

big-endian

standard       按原位元組數

!

network (= big-endian)

standard       按原位元組數

常用語句:
struct.pack(fmt,v1,v2,...)將v1,v2按參數格式進行轉換。參數fmt是格式字元
串,這裡主要是!I。v1,v2,...表示要轉換的python值。
struct.unpack(fmt,string)與pack剛好相反。
例如:
>>> import struct
>>> a=20
>>> str=struct.pack("!I",a)
>>> print repr(str)
'\x00\x00\x00\x14'
>>> print struct.unpack("!I",str)
(20,)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.