Python实现的使用telnet登陆聊天室实例


Posted in Python onJune 17, 2015

本文实例讲述了Python实现的使用telnet登陆聊天室。分享给大家供大家参考。具体如下:

前久在家学习Python的时候写的一个简单的聊天室,可以使用telnet来登陆。

遗憾的是现在对中文的支持很差,英文聊天倒是没什么问题了。

功能很简单的,应该没有你想象的那么强大,但是你如果有兴趣的话可以试试的。

另外,让我惊奇的是它可以在Android的平板上运行SL4A的Python解释器上运行(需要稍微改几句代码,貌似是编码的那个地方,我记不清了)。

现在这个是可以在PC上跑起来的。

废话不多,直接放代码了,就一个py文件而已,而且注释是乱七八糟的,编码风格也不好(好神似我在用类C语言的习惯)。

# Filename: ChatRoomServer.py 
import threading 
import datetime 
import socket 
# a simple log function 
def log(lg): 
  print(lg) 
# Chat room server listen thread class, this class is use for listening client login 
# when a client request to connect server, this class will start a connect thread 
class ServerListenThread(threading.Thread): 
  def __init__(self, hostname, port, accept): 
    threading.Thread.__init__(self) 
    self.hostname = hostname 
    self.port = port 
    self.accept = accept 
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    self.sock.bind((hostname, port)) 
    self.sock.listen(0) 
    log('ServerIp:%s ServerPort:%s waiting for client...'%self.sock.getsockname()) 
  def run(self): 
    clientid = 1 
    while True: 
      client, cltadd = self.sock.accept() 
      log('a request from Id=%s%s'%('%d Address:'%clientid , cltadd)) 
      if self.accept(clientid, client): 
        clientid = clientid + 1 
# Connect thread class, this class is use for connecting with client and receiving client's message 
class ServerConnectThread(threading.Thread): 
  def __init__(self, clientid, client, encoding, receive, disconnect):
    threading.Thread.__init__(self) 
    self.client = client 
    self.clientid = clientid 
    self.encoding = encoding 
    self.receive = receive 
    self.disconnect = disconnect 
    self.clientname = None 
    self.inputs = self.client.makefile('rb', 0) 
    self.outputs = self.client.makefile('wb', 0) 
  def run(self): 
    self.sendstring('Input your name:') 
    while True: 
      string = self.readline() 
      if string: 
        string = string.lstrip() 
        if len(string)>0: 
          self.receive(self, string) 
      else: 
        self.inputs.close() 
        self.outputs.close() 
        break 
    if self.clientname: 
      self.disconnect(self) 
  def sendstring(self, string): 
    self.sendbytes(bytes(string, self.encoding)) 
  def sendbytes(self, bts): 
    self.outputs.write(bts) 
  def readline(self): 
    rec = self.inputs.readline() 
    if rec: 
      string = bytes.decode(rec, self.encoding) 
      if len(string)>2: 
        string = string[0:-2] 
      else: 
        string = ' ' 
    else: 
      string = False 
    return string 
# Chat room server class, this class is constitute of a listen thread and many connect thread 
class ChatRoomServer: 
  def __init__(self, ip='0.0.0.0', port=9113, encoding='utf-8'): 
    self.hostname = ip 
    self.encoding = encoding 
    self.port = port 
    self.clients = {} 
    self.clientnames = {} 
  def whenconnect(self, clientid, client): 
    log('a connect with Id=%s%s'%('%d Address:'%clientid , client.getpeername())) 
    connect = ServerConnectThread(clientid, client, self.encoding, self.whenreceive, self.whenexit)  
    connect.start() 
    return True 
  def whenreceive(self, client, string): 
    log('frome %d, receive:%s (%d)'%(client.clientid, string, len(string))) 
    if client.clientname: 
      if string[0]=='.': 
        self.handlecmd(client, string[1:]) 
      else: 
        now = datetime.datetime.now() 
        sendstring = '%s %s\r\n %s\r\n'%(now, client.clientname, string) 
        self.sendtoall(sendstring, client) 
    else: 
      if self.clientnames.__contains__(string): 
        client.sendstring('%s is exited!!!\r\n'%string) 
      else: 
        client.clientname = string 
        client.sendstring('Hell, %s!!!\r\n'%client.clientname) 
        self.addclient(client) 
    return True 
  def whenexit(self, client): 
    self.delclient(client) 
    return True 
  def handlecmd(self, client, cmd): 
    log('cmd: %s'%cmd) 
    if cmd=='user': 
      client.sendstring('User list(%d):\r\n'%len(self.clients)) 
      for i in self.clients: 
        clt = self.clients[i] 
        client.sendstring(' %d\t%s\r\n'%(clt.clientid, clt.clientname)) 
    else: 
      client.sendstring('Unknow command: %s:\r\n'%cmd) 
  def start(self): 
    serverlisten = ServerListenThread(self.hostname, self.port, self.whenconnect) 
    serverlisten.start() 
  def sendtoall(self, string, notfor): 
    sends = bytes(string, self.encoding) 
    for i in self.clients: 
      if not(notfor and notfor.clientid==i): 
        self.clients[i].sendbytes(sends) 
  def addclient(self, client): 
    self.sendtoall('%s logined!!!\r\n'%client.clientname, client) 
    self.clients[client.clientid] = client 
    self.clientnames[client.clientname] = client.clientid 
  def delclient(self, client): 
    self.sendtoall('%s logouted!!!\r\n'%client.clientname, client) 
    del self.clients[client.clientid] 
    del self.clientnames[client.clientname] 
# start a chat room server 
ChatRoomServer().start()

有了这个服务器程序之后就可以了(当然前提是你安装的Python解释器),没有客户端的,那么你会问怎么开始聊天呢?

下面开始介绍怎么开始聊天,首先你把这个文件运行起来,如下图可以看到服务器正在等待客户端登陆了:

Python实现的使用telnet登陆聊天室实例

客户端直接使用telnet命令登陆,注意端口应该和服务器的一样,命令为:telnet 127.0.0.1 9011,自动打开telnet控制台,输入自己的名字吧:

Python实现的使用telnet登陆聊天室实例

现在你在看看服务器端的控制台界面,可以看到记录了登陆消息:

Python实现的使用telnet登陆聊天室实例

继续使用telnet登陆另外的用户之后就可以聊天了:

Python实现的使用telnet登陆聊天室实例

功能很简陋了,不过这让我想起了二三十年前的事,嘿嘿,那时候应该就是这样子聊天的了吧,生在这个时代的我们永远都体会不到那种乐趣了。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python对数组进行反转的方法
May 20 Python
python制作websocket服务器实例分享
Nov 20 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
python实现简易云音乐播放器
Jan 04 Python
Python模拟随机游走图形效果示例
Feb 06 Python
python实现动态创建类的方法分析
Jun 25 Python
python实现连连看辅助(图像识别)
Mar 25 Python
python同步windows和linux文件
Aug 29 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
python实现图片上添加图片
Nov 26 Python
python 基于opencv 绘制图像轮廓
Dec 11 Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 #Python
Python合并两个字典的常用方法与效率比较
Jun 17 #Python
Python操作串口的方法
Jun 17 #Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 #Python
Django中模型Model添加JSON类型字段的方法
Jun 17 #Python
Python中map和列表推导效率比较实例分析
Jun 17 #Python
wxPython使用系统剪切板的方法
Jun 16 #Python
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
python开发之str.format()用法实例分析
2016/02/22 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
详解python的变量缓存机制
2021/01/24 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
装饰资料员岗位职责
2013/12/30 职场文书
总经理司机职责
2014/02/02 职场文书
平安工地建设方案
2014/05/06 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
Python实战之实现康威生命游戏
2021/04/26 Python
gateway网关接口请求的校验方式
2021/07/15 Java/Android