1、SocketServer併發連接

TCP版

socketserver

由於socket無法實現併發,當一個客戶端連接進來之後,另一個客戶端就阻塞了,那麼此時,我們就需要採取socketserver模塊來實現併發連接;

# 服務端

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2018/3/10 11:16

# @Author : CaiChangEn

# @Software: PyCharm

import socketserver

class Server(socketserver.BaseRequestHandler): # 固定格式,必須繼承這個類

def handle(self): # 固定格式,必須定義一個handle的方法

print(self.request) #相當於conn(accept建立的客戶連接)

print(self.client_address) #相當於conn(accept接收的客戶端地址)

while True: #消息循環

try: #解決客戶端無故斷開會導致服務端死掉的問題

data=self.request.recv(1024) #收消息

if not data:break # 解決不斷接收的問題

print('收到客戶端的消息是:',data,self.client_address) #打印收到的消息

self.request.sendall(data.upper()) #發消息

except Exception as error: # 如果捕獲到客戶端異常關閉,就首先打印錯誤信息,然後break

print(error) #打印錯誤信息

break #跳出循環

if __name__ == '__main__':

s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),Server) #ThreadingTCPServer:多線程的TCP服務端,第一個傳入的參數的該服務端監聽的IP和端口,第二個參數就是我們的Server類,這樣實例化的結果賦值給s;

s.serve_forever() #永遠服務,相當於socket版本的客戶端到服務端的通訊連接循環,serve_forever是ThreadingTCPServer下面的一個函數屬性,那麼上面的Server裡面的連接循環就會套到我們的serve_forever通訊循環裡面;

# 步驟

# ThreadingTCPServer 處理連接

# serve_forever連接循環

# #消息循環

# 客戶端1

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2018/3/10 11:17

# @Author : CaiChangEn

# @Software: PyCharm

from socket import *

IP_PORT=('127.0.0.1',8080)

BUFFER_SIZE=1024

BACK_LOG=5

TCP_CLIENT=socket(AF_INET,SOCK_STREAM)

TCP_CLIENT.connect(IP_PORT)

while True:

message=input('> ')

if not message:continue

if message == 'Q' or message == 'q':break

TCP_CLIENT.send(message.encode('utf-8'))

print(TCP_CLIENT.recv(BUFFER_SIZE).decode('utf-8'))

# 客戶端2

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2018/3/10 11:17

# @Author : CaiChangEn

# @Software: PyCharm

from socket import *

IP_PORT=('127.0.0.1',8080)

BUFFER_SIZE=1024

BACK_LOG=5

TCP_CLIENT=socket(AF_INET,SOCK_STREAM)

TCP_CLIENT.connect(IP_PORT)

while True:

message=input('> ')

if not message:continue

if message == 'Q' or message == 'q':break

TCP_CLIENT.send(message.encode('utf-8'))

print(TCP_CLIENT.recv(BUFFER_SIZE).decode('utf-8'))

# 結果

<socket.socket>

('127.0.0.1', 50057)

<socket.socket>

('127.0.0.1', 50058)

收到客戶端的消息是: b'clent1 say hello' ('127.0.0.1', 50057)

收到客戶端的消息是: b'clent2 say hello' ('127.0.0.1', 50058)

收到客戶端的消息是: b'client1' ('127.0.0.1', 50057)

收到客戶端的消息是: b'client2' ('127.0.0.1', 50058)

UDP版

# 服務端

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2018/3/15 12:18

# @Author : CaiChangEn

# @Software: PyCharm

import socketserver

IP_ADDR=('127.0.0.1',8081)

BUFFER_SIZE=1024

class SERVER(socketserver.BaseRequestHandler):

def handle(self):

data,addr=self.request

print(data.decode('utf-8'),self.client_address)

addr.sendto(data.upper(),self.client_address)

if __name__ == '__main__':

UDP_SERVER=socketserver.ThreadingUDPServer(IP_ADDR,SERVER)

UDP_SERVER.serve_forever()

# 客戶端1

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2018/3/15 12:18

# @Author : CaiChangEn

# @Software: PyCharm

from socket import *

IP_ADDR=('127.0.0.1',8081)

BACKLOG=5

BUFFER_SIZE=1024

UDP_CLIENT=socket(AF_INET,SOCK_DGRAM)

while True:

msg=input('input msg: ').encode('utf-8')

if not msg:continue

try:

UDP_CLIENT.sendto(msg,IP_ADDR)

data,addr=UDP_CLIENT.recvfrom(BUFFER_SIZE)

print(data.decode('utf-8'))

continue

except Exception:

break

UDP_CLIENT.close()

# 客戶端2

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2018/3/15 12:18

# @Author : CaiChangEn

# @Software: PyCharm

from socket import *

IP_ADDR=('127.0.0.1',8081)

BACKLOG=5

BUFFER_SIZE=1024

UDP_CLIENT=socket(AF_INET,SOCK_DGRAM)

while True:

msg=input('input msg: ').encode('utf-8')

if not msg:continue

try:

UDP_CLIENT.sendto(msg,IP_ADDR)

data,addr=UDP_CLIENT.recvfrom(BUFFER_SIZE)

print(data.decode('utf-8'))

continue

except Exception:

break

UDP_CLIENT.close()

結果

clien1 ('127.0.0.1', 56923)

clien2 ('127.0.0.1', 56922)

clien1 ('127.0.0.1', 56923)

clien2 ('127.0.0.1', 56922)


分享到:


相關文章: