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

本文实例讲述了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解释器),没有客户端的,那么你会问怎么开始聊天呢?

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

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

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

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

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

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

(0)

相关推荐

  • 小小聊天室Python代码实现

    相对于Java方式的聊天室,Python同样可以做得到.而且可以做的更加的优雅.想必少了那么多的各种流的Python Socket,你一定会喜欢的. 至于知识点相关的内容,这里就不多说了. UDP方式 服务器端 # coding:utf-8 # __author__ = 'Mark sinoberg' # __date__ = '2016/7/7' # __Desc__ = 创建一个简单的套接字监听请求 import socket HOST = '192.168.59.255' PORT = 9

  • python的tkinter布局之简单的聊天窗口实现方法

    本文实例展示了一个python的tkinter布局的简单聊天窗口.分享给大家供大家参考之用.具体方法如下: 该实例展示的是一个简单的聊天窗口,可以实现下方输入聊天内容,点击发送,可以增加到上方聊天记录列表中.现在只是"单机"版. 右侧预留了空位可以放点儿其它东西.感兴趣的读者可以进一步做成socket双方互聊. 以下是功能代码部分: from Tkinter import * import datetime import time root = Tk() root.title(unic

  • 详解Python各大聊天系统的屏蔽脏话功能原理

    突然想到一个视频里面弹幕被和谐的一满屏的*号觉得很有趣,然后就想用python来试试写写看,结果还真玩出了点效果,思路是首先你得有一个脏话存放的仓库好到时候检测,那么个人还是喜欢用列表,因为列表灵活使用扩展都很方便,有了脏话库我们在来想核心怎么屏蔽脏话,你要记得玩家输入的弹幕数据类型是什么首档其次是字符串如果没有特殊要求就它了,万变不离其中总是这几个数据结构嘛,有了字符串替换*号什么的都轻松许多了对吧,今天所聊的是完整的一套结构,为了让大家更清晰学会,我会拆分代码然后在组装起来讲,这样大家就会有

  • 快速实现基于Python的微信聊天机器人示例代码

    最近听说一个很好玩的图灵机器人api,正好可以用它做一个微信聊天机器人,下面是实现 # test.py import requests import itchat #这是一个用于微信回复的库 KEY = '8edce3ce905a4c1dbb965e6b35c3834d' #这个key可以直接拿来用 # 向api发送请求 def get_response(msg): apiUrl = 'http://www.tuling123.com/openapi/api' data = { 'key' :

  • 基于Python如何使用AIML搭建聊天机器人

    借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.AIML,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由Richard Wallace和世界各地的自由软件社区在1995年至2002年发明的. AIML 是什么? AIML由Richard Wallace发明.他设计了一个名为 A.L.I.C.E. (Artificial Linguistics Internet Comp

  • python socket多线程通讯实例分析(聊天室)

    本文实例讲述了python socket多线程通讯方法.分享给大家供大家参考,具体如下: #!/usr/bin/evn python """ 这是一个Socket+多进程的例子(聊天服务端) """ import socket import threading # 处理中文数据用的 encoding = "GBK" def HKServer(client, addr): """ 与客户端时实通讯函

  • Python socket C/S结构的聊天室应用实现

    Python socket C/S结构的聊天室应用 服务端: #!/usr/bin/env python #coding:utf8 import socket,select def broadcast_data (sock,message): for socket in conn_list: if socket != server_socket and socket != sock : try : socket.send(message) except : socket.close() conn

  • 使用Python的Tornado框架实现一个一对一聊天的程序

    按思路来聊: 类似微信,点击用户可以进入一对一聊天页面:另有聊天框列表包含所有存在聊天记录的一对一聊天框,点击进入聊天页面. [数据结构] 因为双方都有聊天记录,所以每一个聊天实际上得储存两份,设计的数据结构如下: A : user_a = {"id":1,"name":"A"} B : user_b = {"id":2,"name":"B"} A的聊天记录: chat_a = { &q

  • python实现简单点对点(p2p)聊天

    点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具有独一属性的对象并添加到连接列表中,对于每一个连接对象发送过来的信息必须要包含主要的三项内容(from,to,messages),这样当信息发送到服务器之后服务器根据to的连接对象遍历连接列表找到目标对象将信息发送给目标,目标拿到信息后就知道是谁发过来的,然后根据id号码进行回复.此实现将会继续完善,后续新加功能将会在我个人github主页展现 服务器端实现: #coding:utf-8 ''' file:server.py

  • python聊天程序实例代码分享

    代码简单,直接看代码吧: 复制代码 代码如下: import socketimport threadingimport re#import Tkinter def ser():    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)    s.bind(('',33333))    s.listen(1)    conn,addr=s.accept()    while True:        print '[%s:%d] send a me

随机推荐