欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

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.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载