1. 程式人生 > >python-網絡編程-03

python-網絡編程-03

-- pri def 只有一個 host 等待 thread 服務器端 self.

首先我們可以看下可以最簡單的交互性的服務端和客戶端程序

server

import socket

def main():
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind((‘localhost‘,8000))
    sock.listen(5)
    while True:
        print ‘1‘
        connection ,clent_addr = sock.accept()
        while 1:
            buf = connection.recv(1024)
            connection.sendall(‘hi‘)
            print buf
    connection.close()
if __name__ == ‘__main__‘:
    main()

[server]:在創建socket之後,服務端會一直保持阻塞狀態,然後一旦有用戶連接,就立即等待用戶發送數據,然後接收到用戶發的數據之後 理解返回一個字符後,然後狀態變成等待下次連接

client

import socket
sock = socket.socket()
sock.connect((‘localhost‘, 8000))
sock.settimeout(5)
while 1:
    res = sock.recv(1024)
    print res
    data = raw_input(‘input:‘)
    sock.sendall(data)
sock.close()

[client]:去連接server端然後不斷發送數據,然後接受返回。

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

那麽你可以發現上面的server端的代碼 其實只能同時接受一個請求,因為只有一個線程去處理這個段代碼

那麽我可以吧server端的代碼換成

import SocketServer

class MyServer(SocketServer.BaseRequestHandler,object):
    def handle(self):
        conn = self.request
        conn.sendall(‘this is a tast‘)
        Flag = True
        while Flag:
            data = conn.recv(1024)
            print "data:",data
            if data == "exit":
                Flag = True
            elif data == ‘0‘:
                conn.sendall("The winter in comming")
            else:
                conn.sendall("please input again")

if __name__ == "__main__":
    server01 = SocketServer.ThreadingTCPServer((‘127.0.0.1‘,8080),MyServer)
    print "server is running.."
    server01.serve_forever()

我們通過借助socket自帶的類寫出來了 多線程的服務器端,能夠收發消息

python-網絡編程-03