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)
閱讀更多 動漫資深愛好者和IT 的文章