Python網絡編程,TCP/IP服務器與客戶端通信

fdum5767 7年前發布 | 15K 次閱讀 Socket Python TCP/IP Python開發

初學 python,前段時間買了兩本書《python 編程從入門到實踐》《Python 核心編程第三版》,第一本書主要講的是一些基本語法和一些基本的使用方法,而第二本則深入很多,自己看來也是一知半解,剛好看到了這部分網絡編程,依然有好多不太理解的地方,不過想來通過自己不斷的摸索,不斷地搜尋資料學習,早晚應該會變得通透吧.......

這部分主要使用的模塊就是 socket 模塊,在這個模塊中可以找到 socket()函數,該函數用于創建套接字對象,套接字也有自己的方法集,這些方法可以實現基于套接字的網絡通信。

socket()模塊函數

要創建套接字,必須使用 socket.socket()函數,他一般的語法如下

socket(socket_family, socket_type, protocol=0)

其中socket_family是 AF_UNIX或 AF_INET,socket_type 是 SOCK_STREAM 或 SOCK_DGRAM,protocol 通常省略,默認=0.

所以創建 TCP/IP 套接字,可以使用下面的方式調用 socket.socket().

tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

同樣創建 UDP/IP 套接字,使用下面的方法調用

udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

創建 TCP 服務器

創建 TCP 服務器的流程基本如下,并非正真正的代碼

ss = socket()                    #創建服務器套接字
        ss.bind()                           #套接字與地址綁定
        ss.listen()                         #監聽連接
        inf_loop:                          #服務器無限循環
                cs = ss.accepr()      #接受客戶端連接
                comm_loop:            #通信循環
                        cs.recv()/cs.send()      #對話(接收/發送)
                cs.close()                #關閉客戶端套接字
        ss.close()                        #關閉服務器套接字(可選)

實際中創建 TCP 服務器基本流程就如上邊所說,可能稍有不同但基本思路應該是相通的,下邊是真正穿件服務器的代碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from socket import *           #將 socket 屬性引入到命名空間

HOST = ''                   #這是對 bind()方法的標識表示可以使用任何可用的地址
PORT = 21571           #端口號
BUFSIZ = 1024          #緩沖區大小,1kb
ADDR = (HOST,PORT)      #地址????

tcpSerSocket = socket(AF_INET,SOCK_STREAM)       #創建 tcp 套接字
tcpSerSocket.bind(ADDR)                     #將地址綁定到套接字上
tcpSerSocket.listen(5)                        #設置并啟動套接字監聽

while True:               #無限循環,等待客戶端連接
    print('waiting for connection...')      
    tcpCliSocket,addr = tcpSerSocket.accept()        #被動接受客戶端連接          
    print('...connected from:',addr)

    while True:            #對話循環,等待客戶端發送消息
        data = tcpCliSocket.recv(BUFSIZ)     #接收客戶端消息
        if not data:          #如果消息是空白,跳出對話循環,關閉當前連接
            break
        tcpCliSocket.send(data)      #如果收到消息,將消息原封不動返回客戶端

    tcpCliSocket.close()
tcpSerSocket.close()

創建 TCP 客戶端

同上邊一樣,一個簡單的非代碼流程

cs = socket()        #創建客戶端套接字
        cs.connect()          #嘗試連接服務器
        comm_loop:          #通信循環
                cs.send()/cs.recv()    #對話(發送/接收)
        cs.close()             #關閉客戶端套接字

實際中創建客戶端也是翻譯上邊的步驟

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from socket import *

HOST = 'localhost'       #服務器的主機名
PORT = 21571          #端口號
BUFSIZ = 1024         #緩沖區
ADDR = (HOST,PORT)     #地址

tcpCliSocket = socket(AF_INET,SOCK_STREAM)    #創建客戶端套接字
tcpCliSocket.connect(ADDR)          #連接服務器

while True:                #通信循環
    data = input('> ')       #客戶端輸入信息
    if not data:     #如果輸入信息為空,則跳出循環,關閉通信
        break

    data = str.encode(data)           
    tcpCliSocket.send(data)     #發送客戶端信息
    data = tcpCliSocket.recv(BUFSIZ)     #接受服務器返回信息
    if not data:        #如果服務器未返回信息,關閉通信循環
        break
    print('get:',data.decode('utf-8'))

tcpCliSocket.close()

當然,這只是最基礎的通信,而且關于主機名,端口號之類的東西暫時還不是很懂,目前所做的只是在同一臺電腦上通信,端口號也需要一致,如果不同的電腦進行通信該怎么做?我還只是個小白.....

 

來自:http://www.jianshu.com/p/92fb9fcc4f4f

 

 本文由用戶 fdum5767 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!