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从MP3文件获取id3的方法
Jun 15 Python
Python下Fabric的简单部署方法
Jul 14 Python
Python 中的 else详解
Apr 23 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
python中的常量和变量代码详解
Jul 25 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
基于plt.title无法显示中文的快速解决
May 16 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 Python
python开发的自动化运维工具ansible详解
Aug 07 Python
python游戏开发之pygame实现接球小游戏
Apr 22 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
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
读jQuery之一(对象的组成)
2011/06/11 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
js实现交通灯效果
2017/01/13 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
决策树的python实现方法
2014/11/18 Python
PyMongo安装使用笔记
2015/04/27 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python 通配符删除文件的实例
2018/04/24 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
《猴子种树》教学反思
2014/02/14 职场文书
银行求职信怎么写
2014/05/26 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
教师先进个人材料
2014/12/17 职场文书
毕业班工作总结
2015/08/10 职场文书
redis实现排行榜功能
2021/05/24 Redis
React列表栏及购物车组件使用详解
2021/06/28 Javascript
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android