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实现360皮肤按钮控件示例
Feb 21 Python
Python性能优化的20条建议
Oct 25 Python
Python中title()方法的使用简介
May 20 Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
基于python3抓取pinpoint应用信息入库
Jan 08 Python
Django中ORM找出内容不为空的数据实例
May 20 Python
Python dict的常用方法示例代码
Jun 23 Python
pytorch使用horovod多gpu训练的实现
Sep 09 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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
实用函数9
2007/11/08 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
php post换行的方法
2020/02/03 PHP
IE图片缓存document.execCommand("BackgroundImageCache",false,true)
2011/03/01 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
python的urllib模块显示下载进度示例
2014/01/17 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python实现八大排序算法
2016/08/13 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
python中下标和切片的使用方法解析
2019/08/27 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
linux面试题参考答案(6)
2014/08/29 面试题
挂职自我鉴定
2014/02/26 职场文书
青年文明号服务承诺
2014/03/31 职场文书
企业标语口号
2014/06/10 职场文书
生产助理岗位职责
2014/06/18 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
介绍信如何写
2015/01/31 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
MySQL优化之慢日志查询
2022/06/10 MySQL