python实现简易聊天室(Linux终端)

本文实例为大家分享了python实现简易聊天室的具体代码,供大家参考,具体内容如下

群聊聊天室

1.功能:类似qq群聊功能

1.有人进入聊天室需要输入姓名,姓名不能重复

2.有人进入聊天室,其他人会受到通知
xxx进入聊天室

3.一个人发消息,其他人会受到消息
xxx:xxxxxxxx

4.有人退出聊天室,其他人也会收到通知
xxx退出聊天室

5.扩展功能:服务端消息公告,服务端发送消息所有人都能收到
管理员消息:xxxxxxxx

2.确定技术模型

1.服务端和客户端

服务端处理请求,发送管理员消息
客户端执行各种功能

2.套接字选择:udp套接字

3.消息发送模型:转发
客户端 ~> 服务端 ~> 其他客户端

4.存储用户信息:{name:addr}

5.处理收发关系:多进程分别处理收发

3.注意事项

1.设计封装方案

2.写一个功能模块测试一个模块

3.注意注释的添加

#coding =utf-8
'''
chat room
env:python3.5
exc:socket and fork
name:mianmabb
email:mianmabb@163.com
服务端功能:
1.搭建网络通信
2.处理进入聊天室
    * 接收姓名
    * 判断是否允许进入
    * 将结果反馈给客户端
    * 如果不允许则结束,允许则将用户插入数据结构
    * 给其他人发送通知
3.处理聊天
    * 接收消息,判断消息类型,分为L(输入姓名),C(发消息),Q(退出聊天室)
    * 将消息转发
4.处理退出聊天室
5.发送管理员消息
'''

from socket import *
from os import *
from sys import *

user = {}   #创建空字典用来存储用户的昵称和地址

#处理登录
def do_login(s,name,addr):
    if name in user:    #判断昵称是否已经存在
        s.sendto('该昵称已被占用'.encode(),addr)
        return
    else:    #昵称不存在,则发送约定好的'OK'
        s.sendto(b'OK',addr)

    #功能:有人进入聊天室,其他人会收到消息
    msg = '\n   欢迎 %s 进入聊天室   '%name
    for i in user:    #发送该条消息给其他用户
        s.sendto(msg.encode(),user[i])

    user[name] = addr   #将该用户插入数据结构(字典)

#处理聊天
def do_chat(s,name,text):
    msg = '%s : %s'%(name,text)   #设置消息显示格式
    for i in user:
        s.sendto(msg.encode(),user[i])

#处理退出
def do_quit(s,name):
    msg = '%s 退出了聊天室'%name
    for i in user:
        if i != name:   #给其他人发送该用户退出的消息
            s.sendto(msg.encode(),user[i])
        else:   #给该用户客户端发送约定好的EXIT让父进程退出
            s.sendto(b'EXIT',user[i])
    del user[name]   #删除字典中该用户

#处理请求
def do_request(s):
    #循环接受所有客户请求
    while True:
        try:
            data,addr = s.recvfrom(1024)
        except KeyboardInterrupt:    #捕获父进程直接退出错误
            exit('服务端退出!')

        # print(data.decode())
        msgList = data.decode().split()   #按空格拆分为列表,方便索引

        if msgList[0] == 'L':    #判断消息类型
            do_login(s,msgList[1],addr)

        elif msgList[0] == 'C':
            text = ' '.join(msgList[2:])  #将消息中可能有的空格加回来
            do_chat(s,msgList[1],text)
        elif msgList[0] == 'Q':
            do_quit(s,msgList[1])

def main():
    s = socket(AF_INET,SOCK_DGRAM)
    ADDR = ('0.0.0.0',8888)
    s.bind(ADDR)

    #创建进程
    pid = fork()
    if pid < 0:
        print('Error')
    elif pid == 0:   #子进程用来发送管理员消息
        while True:
            try:
                text = input('管理员 : ')
            except KeyboardInterrupt:    #捕获子进程直接退出错误
                exit()

            msg ='C 管理员 %s'%text
            s.sendto(msg.encode(),ADDR)

    else:   #父进程用来处理请求
        do_request(s)

main()

客户端功能:

'''
1.搭建通信
2.进入聊天室
    * 输入姓名
    * 发送给服务器
    * 接收服务器反馈
    * 不允许则重新输入,允许则进入聊天室
    * 创建新的进程用于消息收发
3.聊天
    * 循环发送消息  消息类型分为L(输入姓名),C(发消息),Q(退出聊天室)
    * 循环接收消息
4.退出聊天室
5.接受管理员消息
'''

from socket import *
from os import *
from sys import *

ADDR = ('127.0.0.1',8888)    #填写服务端地址

#循环发送消息
def send_msg(s,name):
    while True:
        try:
            text = input()   #客户输入要发送的消息
        except KeyboardInterrupt:   #子进程 防止用户Ctrl+C直接退出
            text = 'quit'

        if text.strip() == 'quit':    #规定输入quit退出
            msg = 'Q ' + name     #消息类型,姓名
            s.sendto(msg.encode(),ADDR)
            exit('您已退出聊天室')
        else:
            msg = 'C %s %s'%(name,text)  #消息类型,姓名,消息
            s.sendto(msg.encode(),ADDR)

#循环接收信息
def recv_msg(s):
    while True:
        try:
            data,addr = s.recvfrom(1024)
        except KeyboardInterrupt:    #父进程 防止用户Ctrl+C直接退出
            exit()
        if data.decode() =='EXIT':   #当用户退出,无需再收消息,约定EXIT让父进程退出
            exit()   #退出父进程

        print(data.decode())

#创建网络连接
def main():
    s = socket(AF_INET,SOCK_DGRAM)
    while True:
        name = input('请输入昵称:')     #输入姓名
        if not name:
            return
        msg = 'L ' +name
        #发送请求
        s.sendto(msg.encode(),ADDR)
        #等待回复
        data,addr = s.recvfrom(1024)
        if data.decode() == 'OK':
            print('您已进入聊天室')
            break
        else:   #登录失败
            print(data.decode())  #直接打印服务端的错误信息

    #创建进程
    pid = fork()
    if pid < 0:
        print('Error')
    elif pid == 0:   #子进程发消息
        send_msg(s,name)
    else:      #父进程收消息
        recv_msg(s)

main()

先运行服务端,再运行客户端

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python实现基于C/S架构的聊天室功能详解

    本文实例讲述了Python实现基于C/S架构的聊天室功能.分享给大家供大家参考,具体如下: 一.课程介绍 1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx.time和thread这几个模块. 3.所需环境 本次课中编写客户端需要用到wxPython,它是一个GUI工具包,请先使用下面的命令安装: $ sudo apt-get install python-wxt

  • python实现简单多人聊天室

    本文实例为大家分享了python实现多人聊天室的具体代码,供大家参考,具体内容如下 刚开始学习python,写了一个聊天室练练手. Server.py import socket,select,thread; host=socket.gethostname() port=5963 addr=(host,port) inputs=[] fd_name={} def who_in_room(w): name_list=[] for k in w: name_list.append(w[k]) ret

  • 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实现多人聊天室

    本文实例为大家分享了python实现多人聊天室的具体代码,供大家参考,具体内容如下 一.目的 以实现小项目的方式,来巩固之前学过的Python基本语法以及相关的知识. 二.相关技术 1.wxpython GUI编程 2.网络编程 3.多线程编程 4.数据库编程 5.简单的将数据导出到Excel表 三.存在的漏洞以及不足 1.由于数据库编码的问题,无法使用中文. 2.在客户端关闭后,其相关的线程仍然存在于服务器的用户线程队列中,所以服务器会错误地往已关闭的客户端传送信息. 3.客户端初始登录并加载

  • python编写简易聊天室实现局域网内聊天功能

    本文实例为大家分享了python实现局域网内聊天功能的具体代码,供大家参考,具体内容如下 功能: 可以向局域网内开启接收信息功能的ip进行发送信息,我们可以写两段端口不同的代码来实现在一台电脑上与自己聊天. 关键点: 要想实现此功能必须将程序的端口固定 from socket import * def udp_send(udp_socket): # 发送消息 接收用户输入内容 send_mes = input("请输入发送内容:") # 接收用户输入ip ip = input(&quo

  • Python socket实现简单聊天室

    本文实例为大家分享了Python socket实现简单聊天室的具体代码,供大家参考,具体内容如下 服务端使用了select模块,实现了对多个socket的监控.客户端由于select在Windows下只能对socket使用,所以使用了多线程来实现对客户端输入和socket连接的同时监控.注意这里的socket设置为了非阻塞.这样就实现了在一个线程中同时进行socket的接收和发送. 服务器代码: # -*- coding: utf-8 -*- import socket,select conne

  • 基于python实现聊天室程序

    本文实例为大家分享了python实现简单聊天室的具体代码,供大家参考,具体内容如下 刚刚接触python编程,又从接触java开始一直对socket模块感兴趣,所以就做了一个聊天室的小程序. 该程序由客户端与服务器构成,使用UDP服务,服务器端绑定本地IP和端口,客户端由系统随机选择端口. 实现了群发.私发.点对点文件互传功能. 客户端自建了一个类继承了Cmd模块,使用自定义的命令command进行操作,调用相应的do_command方法. 使用json模块进行消息的封装序列化,在接收方进行解析

  • 小小聊天室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实现的使用telnet登陆聊天室实例

    本文实例讲述了Python实现的使用telnet登陆聊天室.分享给大家供大家参考.具体如下: 前久在家学习Python的时候写的一个简单的聊天室,可以使用telnet来登陆. 遗憾的是现在对中文的支持很差,英文聊天倒是没什么问题了. 功能很简单的,应该没有你想象的那么强大,但是你如果有兴趣的话可以试试的. 另外,让我惊奇的是它可以在Android的平板上运行SL4A的Python解释器上运行(需要稍微改几句代码,貌似是编码的那个地方,我记不清了). 现在这个是可以在PC上跑起来的. 废话不多,直

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

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

随机推荐