Python TCP通信網絡編程


最近在看廖雪峰老師的基礎教程(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()

 

 

最后,需要啟動兩個程序,服務器和客戶端 來驗證,結果如下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM