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不變。