免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1952 | 回复: 0
打印 上一主题 下一主题

python实现的聊天服务器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-24 16:24 |只看该作者 |倒序浏览
转自IBM网站上的一段代码,可以直接运行,好好学习下。
#!/usr/bin/python
import socket
import select
#debug = False
debug = True
class ChatServer:
  def __init__( self, port ):
    if debug: print 'start init ChatServer'
    self.port = port
    self.srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
    self.srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
    self.srvsock.bind( ("", port) )
    self.srvsock.listen( 5 )
    self.descriptors = [self.srvsock]
    print 'ChatServer started on port %s' % port
  def run( self ):
   
    while 1:
      # Await an event on a readable socket descriptor
      (sread, swrite, sexc) = select.select( self.descriptors, [], [] )
      
      # Iterate through the tagged read descriptors
      for sock in sread:
        # Received a connect to the server (listening) socket
        if sock == self.srvsock:
          self.accept_new_connection()
        else:
          # Received something on a client socket
          str = sock.recv(100)
          # Check to see if the peer socket closed
          if str == '':
            host,port = sock.getpeername()
            str = 'Client left %s:%s\r\n' % (host, port)
            self.broadcast_string( str, sock )
            sock.close
            self.descriptors.remove(sock)
          else:
            host,port = sock.getpeername()
            newstr = '[%s:%s] %s' % (host, port, str)
            self.broadcast_string( newstr, sock )
  def accept_new_connection( self ):
    if debug: print 'accept new connection...'
    newsock, (remhost, remport) = self.srvsock.accept()
    self.descriptors.append( newsock )
    newsock.send("You're connected to the Python chatserver\r\n")
    str = 'Client joined %s:%s\r\n' % (remhost, remport)
    self.broadcast_string( str, newsock )
  def broadcast_string( self, str, omit_sock ):
    for sock in self.descriptors:
      if sock != self.srvsock and sock != omit_sock:
        sock.send(str)
    print str
myServer = ChatServer( 2828 ).run()


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/82392/showart_1878034.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP