Python網絡編程之SocketServer

注意:以下內容是個人使用的隨手記錄, 就是介紹了下簡單的使用

歡迎大家來吐槽,準備好瓜子飲料礦泉水,開整!!!

---------------------------------------------------------------------------------------

SocketServer模塊,這裏主要介紹TCP通信

python中網絡編程除了socket模塊還提供了SocketServer模塊,這一模塊主要是對socket模塊進行了封裝,
將socket的對象的創建,綁定,連接,接收,發送,關閉都封裝在裏面,大大簡化了網絡服務的編程。

此模塊提供了以下2個主要的和2個次要的繼承的網絡服務類,用於創建相應的套接字流

TCPServer 創建TCP協議的套接字流
UDPServer 創建UDP協議的套接字流
UnixStreamServer(繼承自TCPServer)
UnixDatagramServer(繼承自UDPServer)

注意:這四種方法都是同步實現的網絡通信

所有四個服務器類的實例都有以下方法和變量:

1、s.socket   用於傳入請求的套接字對象。
2、s.sever_address  監聽服務器的地址。如元組("127.0.0.1",80)
3、s.RequestHandlerClass   傳遞給服務器構造函數並由用戶提供的請求處理程序類。
4、s.serve_forever()  處理無限的請求
5、s.shutdown()   停止serve_forever()循環
6、s.fileno()   返回服務器套接字的整數文件描述符。該方法可以有效地通過輪詢操作(如select()函數)使用服務器實例。

編寫一個SocketServer需要實現以下步驟:

編寫一個handler類,繼承BaseRequestHandler,重寫handle()方法
針對是TCP還是UDP,生成一個server對象
調用server對象的handle_request或者serve_forever方法

案例:服務端(同步)

# -*- coding:utf-8 -*-
import SocketServer

class MyTcpHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        # 接收客戶端發送過來的數據, 去掉收尾空格
        self.data = self.request.recv(1024).strip()
        print self.client_address
        print "ip address is:{} --> the client write: {}".format(
            self.client_address[0], self.data
        )
        self.request.sendall(self.data.upper())  # 發送給客戶端數據轉爲大寫

if __name__ == '__main__':
    HOST, PORT = '127.0.0.1', 9999
    server = SocketServer.TCPServer((HOST, PORT), MyTcpHandler)
    server.serve_forever()

案例:客戶端(同步)

# -*- coding:utf-8 -*-
import socket

HOST = '127.0.0.1'
PORT = 9999
while True:
    data = raw_input('please input your info -->:')
    print 'The client send data is:%s' % data
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.connect((HOST, PORT))
        sock.sendall(data + '\n')
        received = sock.recv(1024)
        print 'received server return data is: %s ' % received
    except:
        pass
    finally:
        sock.close()

運行結果:

服務端:
root@ubuntu:~/learn$ python socket_server.py 
('127.0.0.1', 34234)
ip address is:127.0.0.1 --> the client write: www
('127.0.0.1', 34236)
ip address is:127.0.0.1 --> the client write: ddd


客戶端:
root@ubuntu:~/learn$ python socket_cli.py 
please input your info -->:www
The client send data is:www
received server return data is: WWW 
please input your info -->:ddd
The client send data is:ddd
received server return data is: DDD

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章