# simpleChatRoom **Repository Path**: mooluo_admin/simpleChatRoom ## Basic Information - **Project Name**: simpleChatRoom - **Description**: python firefly 简单版 聊天室 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-01-29 - **Last Updated**: 2021-01-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 说明 #### 启动服务器 ``` python startmaster.py ``` #### 再开两个客户端 ``` python tool/clienttest.py ``` 两边聊天就能说话 ### 配置文件 ``` "chatserver":{"netport":1000,"rootport":20001,"name":"chat","app":"app.server"} ``` 服务器程序 ``` #coding:utf8 from firefly.server.globalobject import netserviceHandle from firefly.server.globalobject import GlobalObject from datetime import * def doConnectionMade(conn): ''' 当连接建立时调用 ''' str1 = 'welcome\r\n' GlobalObject().netfactory.pushObject(10001,bytes(str1,'utf-8'),[conn.transport.sessionno]) str2='%d is Login\r\n' % conn.transport.sessionno lis = list(GlobalObject().netfactory.connmanager._connections.keys()) lis.remove(conn.transport.sessionno) GlobalObject().netfactory.pushObject(10001,bytes(str2,'utf-8'),lis) def doConnectionLost(conn): str2='%d is Logout\r\n' % conn.transport.sessionno lis = list(GlobalObject().netfactory.connmanager._connections.keys()) lis.remove(conn.transport.sessionno) GlobalObject().netfactory.pushObject(10001,bytes(str2,'utf-8'),lis) GlobalObject().netfactory.doConnectionLost = doConnectionLost GlobalObject().netfactory.doConnectionMade = doConnectionMade @netserviceHandle def speak_10001(_conn,data): ''' ''' date = datetime.now() str1 = date.strftime("%Y-%m-%d %H:%M:%S") + "(" + str(_conn.transport.sessionno) + "):\r\n" +str(data) lis = list(GlobalObject().netfactory.connmanager._connections.keys()) lis.remove(_conn.transport.sessionno) GlobalObject().netfactory.pushObject(10001,bytes(str1,'utf-8'),lis) ``` 客户端程序 ``` #coding:utf8 import time from socket import AF_INET,SOCK_STREAM,socket from _thread import start_new_thread import struct BUFSIZE=1024 def sendData(sendstr,commandId): HEAD_0 = bytes([0]) HEAD_1 = bytes([0]) HEAD_2 = bytes([0]) HEAD_3 = bytes([0]) ProtoVersion = bytes([0]) ServerVersion = 0 sendstr = sendstr data = struct.pack('!sssss3I',HEAD_0,HEAD_1,HEAD_2,\ HEAD_3,ProtoVersion,ServerVersion,\ len(sendstr)+4,commandId) senddata = data+sendstr return senddata def resolveRecvdata(data): head = struct.unpack('!sssss3I',data[:17]) length = head[6] data = data[17:17+length] return data def sendMessage(conn): ''' 发送消息 ''' while 1: data = input() length = len(data) if length>80: length = 80 line = length*'-' data+='\r\n'+line conn.sendall(sendData(bytes(data,'utf-8'),10001)) print (line) def receiveMessage(conn): while 1: message = conn.recv(1024) message = resolveRecvdata(message) print(message) class ChatServer(object): """docstring for ChatServer""" def __init__(self, port): self.port = port HOST='localhost' self.srvsock = socket(AF_INET,SOCK_STREAM) self.srvsock.connect((HOST,port)) def run(self): start_new_thread(sendMessage,(self.srvsock,)) start_new_thread(receiveMessage,(self.srvsock,)) if __name__ == '__main__': myServer = ChatServer(1000).run() while 1: pass ```