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格式化字符串实例总结
Sep 28 Python
python通过装饰器检查函数参数数据类型的方法
Mar 13 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
python保存网页图片到本地的方法
Jul 24 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
pandas 对group进行聚合的例子
Dec 27 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
Matplotlib中rcParams使用方法
Jan 05 Python
python3 kubernetes api的使用示例
Jan 12 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中对数据库操作的封装
2006/10/09 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
防止文件缓存的js代码
2013/01/10 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
python求最大连续子数组的和
2018/07/07 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
如何使用repr调试python程序
2020/02/28 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
如何用Python 加密文件
2020/09/10 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
村官学习十八大感想
2014/01/15 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
优秀团支部申报材料
2014/12/26 职场文书
趣味运动会开幕词
2015/01/28 职场文书
通知的格式范文
2015/04/27 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python