1. 程式人生 > >python 網路程式設計 TCP套接字例項

python 網路程式設計 TCP套接字例項

一. 伺服器端程式碼tcpServer.py:

from socket import *
from time import ctime

#HOST變數為空,表示bind()函式可以繫結在所有有效的地址上
HOST = ''
PORT = 21234
#設定緩衝大小為128,可以根據網路情況和需求來進行修改
BUFSIZ = 128
ADDR = (HOST, PORT)

#建立TCP套接字
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
#listen()函式的引數表示最多允許同時接收的連線數,超過這個數目的連線會被拒絕掉
tcpSerSock.listen(5)

while True:
    print 'waiting for connection...'
    tcpCliSock, addr = tcpSerSock.accept()
    print '...connected from:', addr

    while True:
        #接收資料
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        #傳送資料
        tcpCliSock.send('From server response:[%s] %s' % (ctime(), data))

tcpCliSock.close()
tcpSerSock.close()
			

客戶端程式碼tcpClient.py:

from socket import *

HOST = 'localhost'
PORT = 21234
BUFSIZ = 128
ADDR = (HOST, PORT)

#建立客戶端TCP套接字
tcpCliSock = socket(AF_INET, SOCK_STREAM)
#連線伺服器
tcpCliSock.connect(ADDR)

while True:
    data = raw_input('>')
    if not data:
        break
    #傳送資料
    tcpCliSock.send(data)
    #接收資料
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print data
	
tcpCliSock.close()
	

二、 使用SocketServer模組實現TCP伺服器端和客戶端

SocketServer是標準庫中的一個高階模組,用於簡化伺服器端與客戶端的實現。

客戶端程式碼,server.py:

from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime

HOST = ''
PORT = 20123
ADDR = (HOST, PORT)

#繼承SRH類,並重寫handle()函式。當有客戶訊息進來時,handle()函式就會被呼叫。StreamRequestHandler類支援像操作檔案一樣對套接字進行輸入輸出
#操作。通過readline()函式得到客戶訊息,write()函式把訊息返回給客戶。
class MyRequestHandler(SRH):
    def handle(self):
        print '...connect from:', self.client_address
        self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline()))

#利用主機資訊和請求處理類來建立TCP伺服器		
tcpServ = TCP(ADDR, MyRequestHandler)
print 'waiting for connection...'
#無限迴圈,等待與處理客戶請求
tcpServ.serve_forever()

客戶端程式碼,client.py:

from socket import *

HOST = 'localhost'
PORT = 20123
BUFSIZ = 128
ADDR = (HOST, PORT)

while True:
    client = socket(AF_INET, SOCK_STREAM)
#由於SocketServer的請求處理器的預設行為是接受連線,得到請求,然後關閉連線。這使得程式在執行時不能一直保持連線狀態,因此,每次傳送資料前都要
建立一個新的套接字
    client.connect(ADDR)
    data = raw_input('>')
    if not data:
        break
#由於伺服器端的處理器類像檔案一樣操作套接字,所以每次都要傳送行結束符(回車與換行)。伺服器保留並重用客戶端傳送的行結束符。當從伺服器端得到資料
時,使用strip()函式去掉它們
    client.send('%s\r\n' % data)
    data = client.recv(BUFSIZ)
    if not data:
        break
    print data.strip()
	
client.close()