本文实例讲述了Python实现的使用telnet登陆聊天室。分享给大家供大家参考。具体如下:
前久在家学习Python的时候写的一个简单的聊天室,可以使用telnet来登陆。
遗憾的是现在对中文的支持很差,英文聊天倒是没什么问题了。
功能很简单的,应该没有你想象的那么强大,但是你如果有兴趣的话可以试试的。
另外,让我惊奇的是它可以在Android的平板上运行SL4A的Python解释器上运行(需要稍微改几句代码,貌似是编码的那个地方,我记不清了)。
现在这个是可以在PC上跑起来的。
废话不多,直接放代码了,就一个py文件而已,而且注释是乱七八糟的,编码风格也不好(好神似我在用类C语言的习惯)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# 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程序设计有所帮助。