最近在看廖雪峰老師的基礎教程(http://www.liaoxuefeng.com/),今天實現了一下簡單Python的Socket的網絡編程。
1. Socket網絡編程
Socket是網絡編程的一個抽象概念。通常我們用一個Socket表示“打開了一個網絡鏈接”,而打開一個Socket需要知道目標計算機的IP地址和端口號,再指定協議類型即可。
2. 客戶端
大多數連接都是可靠的TCP連接。創建TCP連接時,主動發起連接的叫客戶端,被動響應連接的叫服務器。舉個例子,當我們在瀏覽器中訪問新浪時,我們自己的計算機就是客戶端,瀏覽器會主動向新浪的服務器發起連接。如果一切順利,新浪的服務器接受了我們的連接,一個TCP連接就建立起來的,后面的通信就是發送網頁內容了。
3. 服務器和客戶端之間Socket通信
主要實現了服務器和客戶端之間的Socket通信:
服務器
服務器進程首先要綁定一個端口並監聽來自其他客戶端的連接。如果某個客戶端連接過來了,服務器就與該客戶端建立Socket連接,隨后的通信就靠這個Socket連接了。
所以,服務器會打開固定端口(比如80)監聽,每來一個客戶端連接,就創建該Socket連接。由於服務器會有大量來自客戶端的連接,所以,服務器要能夠區分一個Socket連接是和哪個客戶端綁定的。一個Socket依賴4項:服務器地址、服務器端口、客戶端地址、客戶端端口來唯一確定一個Socket。
但是服務器還需要同時響應多個客戶端的請求,所以,每個連接都需要一個新的進程或者新的線程來處理,否則,服務器一次就只能服務一個客戶端了。
(1)引入模塊
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Mon Mar 28 22:28:29 2016 4 @author: zhanghc 5 """ 6 #引入模塊 7 import socket 8 import threading 9 import time
(2)創建socket,並監聽端口
1 #創建socket 2 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 3 4 #監聽端口 5 s.bind(('127.0.0.1',9999)) 6 s.listen(5) 7 print 'Waiting for connection...'
(3)服務器端創建循環,永久監聽來自客戶端的連接
1 while True: 2 3 #接受一個新連接 4 sock,addr=s.accept() 5 6 #創建新線程來處理TCP連接 7 t=threading.Thread(target=tcplink(sock,addr))
(4)創建TCP連接函數,每個連接創建一個新線程
1 def tcplink(sock,addr): 2 print 'Accept new connection from %s:%s...' % addr 3 sock.send('Welcome!') 4 while True: 5 data=sock.recv(1024) 6 time.sleep(1) 7 if data=='exit' or not data: 8 break 9 sock.send('Hello,%s!'%data) 10 sock.close() 11 print 'Connection from %s:%s closed.'%addr
客戶端程序如下:
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Mon Mar 28 22:40:41 2016 4 5 @author: zhanghc 6 """ 7 8 import socket 9 10 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 11 12 s.connect(('127.0.0.1',9999)) 13 14 print s.recv(1024) 15 16 for data in ['zhang','liu','wang']: 17 s.send(data) 18 print s.recv(1024) 19 20 s.send('exit') 21 s.close()
最后,需要啟動兩個程序,服務器和客戶端 來驗證,結果如下