python的socket入門到高階
SOCKET入門:
原理:服務端一直處理監聽的狀態,當客戶端發起一個請求,服務端監聽到請求建立連線,在建立連線時,若當前客戶端沒有結束,處於阻塞狀態,當前的會話處於不斷的互動狀態,只有當前客戶端結束回話後,才進行下個回話請求,若此時有另外一個連線,不會分配當前的服務端正在使用連線分配給後來的客戶端繪畫
通俗說理解SOCKET過程:小磊子和10086
一天小磊子打電話給10086,10086的小紅接到小磊子的電話,這時候小磊子就開始發牢騷問,我這個月的電話費怎麼那麼多(此時就是SOCKET建立會話連線通訊過程),小紅聽到小磊子的牢騷後,開始在後臺查詢小磊子這個月的電話記錄情況,然後小紅把查到的資料告訴小磊子(此時是客戶端:請求資料-請求處理--迴應資料),你這個月凌晨跟某某女生.....此時浩哥也打電話給10086,要找小紅,此時小紅在接客狀態,在給小磊子幹活,無法接通(客戶端阻塞連線),浩哥不開心,因為他想查下這個月他老婆最近夜裡跟誰在打電話....就隨便找了小麗為浩哥服務(此時是SOCKET的併發過程)......當小磊子掛掉電話後,此時與小紅斷開連線(結束連線),小紅才能繼續接客....繼續等待下一個人到來....
Socket服務端程式設計主要包括下面幾步:
1、開啟socket
2、繫結到一個地址和埠
3、偵聽進來的連線
4、接受連線
5、讀取資料
客戶端過程:
1、開啟一個socket
2、連線一個地址和埠
3、讀寫資料
####網路通訊,有TCP/IP還有其他...
socket type:
socket.AF_UNIX:只能夠用於單一的unix系統程序間通訊
socket.AF_INET:伺服器之間網路通訊
socket.AF_NET6IPV6
###簡單例子
SERVER:
import socket
host=''
port=1122
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(1)
conn,addr=s.accept()
print "connected by",addr
while True:
data=conn.recv(1024)
if not data:break
conn.sendall(data)
conn.close()
###CLIENT:
import socket
host='127.0.0.1'
port=1122
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
s.sendall('hello,world')
data=s.recv(1024)
s.close()
print 'received',repr(data)
--SOCKET多執行緒
多執行緒的原理圖:可以理解成成10086的多個客服,在SOCKET裡 有個連線池。
#!/usr/bin/env python
import SocketServer
class MyTcpHandler(SocketServer.BaseRequestHandler):
def handle(self):
print "Got a new conn from ",self.client_address
while True:
data=self.request.recv(1024).strip()
print "recv:",data
self.request.send(data.upper())
if __name__=="__main__":
host,port="localhost",8888
s=SocketServer.ThreadingTCPServer((host,port),MyTcpHandler)
s.server_forver()
###CLIENT不變。