python socketserver最大连接_大聊Python----SocketServer
什么是SocketServer?
SocketServer的最主要的作用是實現并發處理,也就是可以多個用戶同時上傳和下載文件。
socketserver模塊簡化了編寫網絡服務器的任務。
socketserver一共有這么幾種類型
class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
這使用Internet TCP協議,該協議提供客戶端和服務器之間的連續數據流。
class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
它使用數據報文,這是離散的信息包,在傳輸過程中可能會無序到達或丟失。參數與TCPServer相同。
class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)
這些不常用的類與TCP和UDP類相似,但是使用Unix域套接字;它們在非unix平臺上不可用。參數與TCPServer相同。
在繼承關系圖中有五個類,其中四個代表四種類型的同步服務器:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
創建一個socketserver 至少分以下幾步:
1、首先,必須通過子類化BaseRequestHandlerclass并重寫其handle()方法創建一個請求處理程序類;此方法將處理傳入的請求。
2、其次,必須實例化一個服務器類,將服務器的地址和請求處理程序類傳遞給它。
3、然后調用服務器對象的handle_request() orserve_forever()方法來處理一個或多個請求。
4、最后,調用server_close()來關閉套接字
## server.py ##
importsocketserverclass MyTCPHandler(socketserver.BaseRequestHandler): #定義MyTCPHandler這個類
"""The request handler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client."""
def handle(self): #handel默認自父親里面是空的 作用是什么?就是跟客戶端所有操作,都是在handle里完成的,每個請求過來,都會走這里
whileTrue:try:
self.data= self.request.recv(1024).strip()print("{} wrote:".format(self.client_address[0])) #打印客戶端的IP地址
print(self.data)#if not self.data: # 客戶端斷開連接
#print(self.client_address,"斷開連接!")
#break
self.request.send(self.data.upper())exceptConnectionResetError as error:print("客戶端已經斷開連接!",error)break
if __name__ == "__main__":
HOST, PORT= "HW-20180425SPSL", 6969server=socketserver.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
## client.py ##
importsocket
client= socket.socket() #生命socket類型 同時 生成socket連接# 對相
client.connect(('HW-20180425SPSL',6969)) #連接6969端口
whileTrue:
msg= input(">>:").strip()
client.send(msg.encode("utf-8"))
data= client.recv(1024) # print(data.decode())
client.close()
顯示結果:
client.py
server.py
當客戶端進行斷開操作,那么服務端會出現什么情況呢?
SocketServer多并發操作
下面的程序是實現多用戶在線Ftp程序
## client.py ##
importsocketimportosimportjsonclassFtpClient(object):def __init__(self):
self.client=socket.socket()defhelp(self):
msg= '''ls
pwd
cd ../..
get filename
put filename'''
print(msg)defconnect(self,ip,port):
self.client.connect((ip, port))definteractive(self):#self.authenticate()
whileTrue:
cmd= input(">>").strip()if len(cmd) ==0:continuecmd_str=cmd.split()[0]if hasattr(self,"cmd_%s" %cmd_str):
func= getattr(self,"cmd_%s" %cmd_str)
func(cmd)else:
self.help()def cmd_put(self,*args):
cmd_split=args[0].split()if len(cmd_split) > 1:
filename= cmd_split[1]ifos.path.isfile(filename):
filesize=os.stat(filename).st_size
msg_dic={"action": "put","filename":filename,"size": filesize,"overridden":True
}
self.client.send( json.dumps(msg_dic).encode("utf-8") )print("send",json.dumps(msg_dic).encode("utf-8") )#防止粘包,等服務器確認
server_response = self.client.recv(1024)
f= open(filename,"rb")for line inf:
self.client.send(line)else:print("file upload success...")
f.close()else:print(filename,"is not exist")defcmd_get(self):passftp=FtpClient()
ftp.connect('HW-20180425SPSL', 6969)
ftp.interactive()
## server.py ##
importsocketserverimportjsonimportosclassMyTCPHandler(socketserver.BaseRequestHandler):def put(self,*args):'''接收客戶端文件'''cmd_dic=args[0]
filename= cmd_dic["filename"]
filesize= cmd_dic["size"]ifos.path.isfile(filename):
f= open(filename + ".new","wb")else:
f= open(filename , "wb")
self.request.send(b"200 ok")
received_size=0while received_size
data= self.request.recv(1024)
f.write(data)
received_size+=len(data)else:print("file [%s] has uploaded..." %filename)defhandle(self):whileTrue:try:
self.data= self.request.recv(1024).strip()print("{} wrote:".format(self.client_address[0]))print(self.data)
cmd_dic=json.loads(self.data.decode())
action= cmd_dic["action"]ifhasattr(self,action):
func=getattr(self,action)
func(cmd_dic)exceptConnectionResetError as e:print("err",e)break
if __name__ == "__main__":
HOST, PORT= "HW-20180425SPSL", 6969
#Create the server, binding to localhost on port 9999
server =socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
結果顯示:
client:
client(1):
server:
總結
以上是生活随笔為你收集整理的python socketserver最大连接_大聊Python----SocketServer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipv6+ssh+java_IPv6的本
- 下一篇: php 一键登录插件,FastAdmin