首页 > 编程 > Python > 正文

Python socket实现简单聊天室

2020-01-04 15:29:44
字体:
来源:转载
供稿:网友

本文实例为大家分享了Python socket实现简单聊天室的具体代码,供大家参考,具体内容如下

服务端使用了select模块,实现了对多个socket的监控。客户端由于select在Windows下只能对socket使用,所以使用了多线程来实现对客户端输入和socket连接的同时监控。注意这里的socket设置为了非阻塞。这样就实现了在一个线程中同时进行socket的接收和发送。

服务器代码:

# -*- coding: utf-8 -*-import socket,selectconnection_list = []host = ''port = 10001def board_cast(sock,message):  for socket in connection_list:    if socket != server_sock and socket != sock:      try:        socket.send(message)      except:        socket.close()        print str(socket.getpeername())+' is offline'        connection_list.remove(socket)server_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)server_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)server_sock.setblocking(0)server_sock.bind((host,port))server_sock.listen(10)connection_list.append(server_sock)while 1:  readable,writable,error = select.select(connection_list,[],[])  for sock in readable:    if sock == server_sock:      connection,connection_add = sock.accept()      message = str(connection_add)+'enter room'      board_cast(connection,message)      print connection_add,'%s connect'      connection_list.append(connection)    else:      try:        date = sock.recv(1024)        print date        board_cast(sock,'('+str(sock.getpeername())+') :'+date)      except:        message2 = str(sock.getpeername())+ 'is offline'        board_cast(sock,message2)        print str(sock.getpeername())+ ' is offline'        sock.close()        connection_list.remove(sock)        continue

客户端代码:

# -*- coding: utf-8 -*-import socket,threading,timeflag = 0date = ''lock = threading.Lock()host = 'localhost'port = 10001client_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)client_sock.setblocking(0)class Mythread1(threading.Thread):  def __init__(self):    threading.Thread.__init__(self)  def run(self):    global flag, date    while 1:      date = raw_input()      if len(date):        lock.acquire()        flag = 1        lock.release()class Mythread2(threading.Thread):  def __init__(self):    threading.Thread.__init__(self)  def run(self):    global flag    global date    while 1:      try:        buf = client_sock.recv(1024)        if len(buf):          print buf      except:        pass      if flag:        try:          client_sock.send(date)        except socket.error, e:          print e        lock.acquire()        flag = 0        lock.release()try:  client_sock.connect((host,port))  print"连接成功"except socket.error,e:  print et1 = Mythread1()t2 = Mythread2()t1.start()t2.start()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到python教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表