1. 程式人生 > >python_day27__socketserver模組_多人和一個人聊天(2)

python_day27__socketserver模組_多人和一個人聊天(2)

  最近肯是事情有點多吧,然後就一直沒有去學習python,今天補上了。

server端

#Author:'haijing'

#date:2018/11/15
#socket的方法比如bind方法、listen方法、都被封裝在socketserver中
#具體怎麼去接收和傳送都在類中的handle方法中自己去定義
#listen方法在socketserver中預設為5個

import socketserver

class MyServer(socketserver.BaseRequestHandler): #定義一個類MyServer(類名可隨意),並繼承socketserver.BaseRequestHandler這個類

def handle(self): #必須叫hanlde,因為在socketserver模組下BaseRequestHandler類下有handle方法,現在重寫這個方法
print ("服務端啟動...")
while True:
conn = self.request #等價於conn, addr = sk.accept()
print (self.client_address) #
while True:
client_data=conn.recv(1024) #收

print (str(client_data,"utf8"))
print ("waiting...")
server_response = input('>>>')
conn.sendall(bytes(server_response,'utf8')) #發 server端輸入併發送
conn.close()

if __name__ == '__main__': #防止在呼叫server.py或者模組時,執行下面的語句,即import server會自動執行下面的語句,為防止執行,那麼加上if __name__=='__main__'

server = socketserver.ThreadingTCPServer(('127.0.0.1',8091),MyServer) #固定的形式,只要想實現併發,那麼就這樣寫
server.serve_forever() #啟動,執行handle方法
#Threading多執行緒 TCP協議 Server服務

#socket都封裝在了socketserver中
#只有handle不能改,其餘變數都可以隨意的改

=========================================以下均是相關解釋==============================================


#對於socketserver.ThreadingTCPServer(('127.0.0.1',8091),MyServer)
#socketserver.py是一個模組,該模組下有ThreadingTCPServer類
#看到一個類,首先要去看它自己有沒有__init__()方法,如果自己沒有,那麼再自左向右的看繼承的父類中有沒有__init__()方法

#對於server.serve_forever()
#首先會去ThreadingTCPServer類中去找,有沒有serve_forever方法,如果沒有,那麼再去ThreadingTCPServer繼承的類中去找
#有沒有serve_forever方法,如果ThreadingTCPServer繼承的類中沒有,那麼再去(ThreadingTCPServer繼承的類)的繼承的類中
#去找,有沒有serve_forever方法


#比如在Foo.py中的最後有兩句
# if __name__ == '__main__':
# hello() #其中hello是Foo.py中的一個方法,其中hello做測試用
# 在另一個檔案中呼叫Foo這個模組時候
# import Foo 如果不加上if __name__ == '__main__': 那麼import Foo就會去執行測試用的語句hello方法
=================================相關解釋結束============================================================


client端
#Author:'haijing'
#date:2018/11/15
#client端沒有多大的變化

import socket

ip_port = ('127.0.0.1',8091)
sk = socket.socket()
sk.connect(ip_port)
print ("客戶端啟動:")
while True:
inp = input('>>>')
sk.sendall(bytes(inp,"utf8"))
if inp == 'exit':
break
server_response=sk.recv(1024)
print (str(server_response,"utf8"))
sk.close()