網路通訊是計算機之間的程序之間的通訊。
tcp程式設計:tcp連線建立是雙向通道,客戶端與服務端都可以給對方傳送資料。
建立tcp連線時,主動發起連線的叫客戶端,被動響應連線的叫服務端。
建立乙個tcp的socket連線:
用socket(family,type)建立套接字獲得socket物件。
family一般有兩種af_inet(預設)與af_inet6 。type:sock_stream(預設)面向連線。sock_dgram面向非連線
s=socket.socket(socket.af_inet,socket.sock_stream)
建立連線
s.connect((ip位址,埠號))
其中,af_inet表示的是指定使用ipv4協議,ipv6為af_inet6。sock_stream指定使用面向劉的tcp協議。
當客戶端發起連線時,除了ip位址外,還需要埠號。某一些服務的埠號有一些標準。如,80分配給web服務作為標準埠(http的埠),21分配給ftp服務作為標準埠,25分配給smtp服務作為標準埠(簡單郵件傳輸協議)。埠號從0到1023,這些埠號一般固定分配給一些服務。埠號從1024到65535,這些埠號一般不固定分配給某個服務,許多服務都可以使用這些埠。
socket物件的一些方法:
服務端套接字:
bind() 將套接字繫結到位址。 在af_inet下,以元組(ip,port)的形式表示位址
listen([backlog]) 開始tcp監聽。backlog指定最多可以監聽的鏈結數量。值至少為1。
accept() 函式用於面向連線的套接字型別。accept()將從連線請求佇列中獲得連線資訊(客戶端位址),建立新的套接字,並返回該套接字的描述符。accept返回的是乙個新套接字描述符,客戶端可以通過這個描述符和伺服器通訊,而最初通過socket建立的套接字描述符依然用於監聽客戶端請求。
客戶端套接字:
connect(address) 將套接字連線到遠端位址。位址形式為(ip,port)。如果連線出錯,返回socket.error錯誤。
connect_ex( ) 類似於connect() 出錯時返回出錯碼,而不是丟擲異常
客戶端服務端共有的方法:
recv([buffersize],[flag]) 從套接字接收tcp資料。buffersize指定要接收的最大資料量。當沒有資料可用,阻塞,直到至少有乙個位元組是可用的或者遠端端被關閉。當遠端端被關閉並且所有資料被讀取完畢時,返回空字串。
recv_into(buffer,[nbytes,[flags]]) 將資料儲存到緩衝區中,而不是建立乙個新的字串。從套接字接收緩衝區位元組。如果沒有指定buffersize或buffersize為0,則接收緩衝區最大可容位元組數。
send(data,[flags]) 向套接字傳送tcp資料。將string中的資料傳送到連線的套接字。返回要傳送的位元組數量(可能小於len(data))。
sendall(data,[flags]) 向套接字傳送tcp資料。會重複呼叫send(),直到傳送完所有資料。如果發生錯誤,無法判斷已經傳送了多少資料。傳送成功返回none。
recvform(buffersize,[flags]) 接收udp資料,與recv()類似,但返回值是(data,address)。其中data是包含接收資料的字串,address是傳送資料的套接字位址。
recvfrom_into(buffer,[nbytes],[flags]) 類似於recv_into(),但也返回傳送端的位址資訊。
sendto(data,[flag],address) 向套接字傳送udp資料,類似於send(),但該方法允許指定目的位址(形式為(ip,port))。返回值是傳送的位元組數。
close() 關閉套接字。
getpeername() 返回連線套接字的遠端位址。返回值為通常為元組形式(ip,port)
getsockname() 返回套接字本地位址。返回值為通常為元組形式(ip,port)
setsockopt(level,optname,value) 設定套接字選項的值。value可以是整數或字串
getsockopt(level,optname[buffersize]) 返回套接字選項的值。如果給定了非零的buffersize引數,返回值是該長度的字串。否則為整數。
settimeout([timeout]) 設定套接字操作的超時,timeout是乙個浮點數,單位是秒。值為none表示禁用超時等效於setblocking(1)。timeout為0等效於setblock(0)。一般,超時期應該在剛建立套接字時設定,因為它們可能用於連線的操作(如connect())
gettimeout() 返回當前超時值,單位是秒,如果沒有設定超時,則返回none。
fileno() 返回套接字的檔案描述符。
setblocking([flags]) 如果flag為0/false,則將套接字設為非阻塞模式,否則將套接字設為阻塞模式(預設值true/none)。非阻塞模式下,如果呼叫recv()沒有發現任何資料,或send()呼叫無法立即傳送資料,那麼將引起socket.error異常。
makefile() 建立乙個與該套接字相關連的檔案
shutdown(flag) 關閉套接字的讀取端(flag==shut_rd)、套接字的寫入端(flag==shut_wr)或者兩端(flag==shut_rdwr)
share() 與另乙個程序共享套接字。必須提供目標程序的id,並且將生成的位元組物件傳遞給目標程序。這裡的共享套接字例項可以通過呼叫socket.fromshare()獲得。
detach() 關閉套接字物件但不關閉底層檔案描述符。該方法被呼叫後無法使用套接字物件,但檔案描述符可以用於其它用途。返回檔案描述符。
伺服器端工作流程:
(1)使用socket()建立socket
(2)使用bind()把建立的socket繫結到指定tcp埠
(3)呼叫listen()使socket處於監聽狀態。(監聽其它客戶端的連線)
(4)客戶端傳送請求後,呼叫accept()接受客戶端請求,建立連線
(5)與客戶端傳送或接收資料
(6)通訊完畢,關閉socket
客戶端工作流程:
(1)使用socket()建立socket
(2)呼叫connect()向伺服器端socket發起連線
(3)建立連線後,進行資料讀寫
(4)通訊完畢,關閉socket
python網路程式設計 TCP網路程式設計
tcp程式設計 客戶端 import socket 1 套接字 tcp socket socket.socket socket.af inet,socket.sock stream 2 建立鏈結 tcp socket.connect 172.27.35.1 8080 3 傳送資訊 tcp socke...
python 網路程式設計
今天晚上學習了一下python的網路程式設計,實現了client向server傳送資料,server反饋資訊 python 3.3 版本 server from socket import class tcpserver object def init self,serverport self.se...
Python 網路程式設計
usr bin env python encoding utf 8 import socket 通過socket模仿http,獲取baidu網頁 s socket.socket socket.af inet,socket.sock stream af inet指定ipv4協議,sock stream...