1. 程式人生 > >python的socket入門到高階

python的socket入門到高階

SOCKET入門:

wKioL1gYmsjC74WpAAGrbGjhMio078.png-wh_50

原理:服務端一直處理監聽的狀態,當客戶端發起一個請求,服務端監聽到請求建立連線,在建立連線時,若當前客戶端沒有結束,處於阻塞狀態,當前的會話處於不斷的互動狀態,只有當前客戶端結束回話後,才進行下個回話請求,若此時有另外一個連線,不會分配當前的服務端正在使用連線分配給後來的客戶端繪畫

通俗說理解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多執行緒

wKiom1gYrn6xoEZYAAJX-IJqj74046.png-wh_50

多執行緒的原理圖:可以理解成成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不變。