歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

python全雙工socket聊天

來源:本站整理 作者:佚名 時間:2017-09-12 TAG: 我要投稿

自學python一段時間,不停想弄個有意思的器械,以是就拿socket做一個談天室,能夠一對多,一對一全雙工談天。后續能夠完美代碼在鼓弄一個帶gui界面的,比較有逼格j_0061.gif。

辦事端:
應用socketserver模塊,多線程異步處置客戶端新聞,接收客戶新聞并轉發 既辦事端為一個中轉站。
參加了 登岸 注冊 多人談天 一對一談天 避免同時在線

客戶端:
主線程銜接辦事端,兩個子線程分離賣力讀寫

sercer:
 
# _*_ coding:utf-8 _*_
import SocketServer
from time import ctime
import threading, traceback
import Queue
from db import DB
 
lock = threading.Lock()
local_school = threading.local()
 
 
class Handler(object):
    queue = []
    db = DB()
    user_name = {}
 
    def __init__(self, sock):
        self.sock = sock
        self.input = [self.sock]
        # self.queue.append(self.sock)
 
    def recv(self):
        data = self.sock.recv(1024).strip()
        return data
 
    def send(self, data):
        self.sock.sendall(data)
 
    def stop(self):
        self.send('ByeBye')
        self.sock.close()
        self.queue.remove(self.sock)
        del self.user_name[local_school.user]
 
    def exit(self):
        self.sock.close()
        try:
            self.queue.remove(self.sock)
            del self.user_name[local_school.user]
        except ValueError:
            pass
 
    def broadcast(self, user, data):
        for sock in self.queue:
            sock.sendall('[%s] %s::%s' % (ctime(), user, data))
 
    def one(self, user_sock, user, data):
        self.user_name[user_sock].sendall('--------------\n%s\n[%s]::(%s)\n---------------' % (ctime(), user, data))
 
    def yiduiduo(self, user, data):
        time_data = ctime()
        for sock in [x for x in self.queue if x != self.sock]:
            sock.sendall('----------------\n%s\n[%s]::(%s)\n----------------' % (time_data, user, data))
 
    def handler(self):
        funcdict = {
            'login': self.login,
            'registered': self.registered,
        }
        try:  ###非常處置 當客戶端非常斷開銜接或許失常斷開銜接:辦事端處置非常
            self.sock.send('請抉擇::login/registered/exit')
            data = self.recv()
            if data == 'exit':
                self.stop()
                # self.send('exit')
            elif data in funcdict:
                funcdict[data]()
            else:
                self.handler()
        except:
            if self.queue:
                self.exit()
 
            else:
                pass
 
    def login(self):

[1] [2] [3] [4] [5]  下一頁

【聲明】:黑吧安全網(http://www.gkrbnd.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        福彩原副主任