python聊天室详细教程_基于python实现聊天室程序

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

刚刚接触python编程,又从接触java开始一直对socket模块感兴趣,所以就做了一个聊天室的小程序。

该程序由客户端与服务器构成,使用UDP服务,服务器端绑定本地IP和端口,客户端由系统随机选择端口。

实现了群发、私发、点对点文件互传功能。

客户端自建了一个类继承了Cmd模块,使用自定义的命令command进行操作,调用相应的do_command方法。

使用json模块进行消息的封装序列化,在接收方进行解析。

客户端代码如下:

import socket

import threading

import json

import os

from cmd import Cmd

class Client(Cmd):

"""

客户端

"""

prompt = '>>>'

intro = '[Welcome] 简易聊天室客户端(Cli版)\n' + '[Welcome] 输入help来获取帮助\n'

buffersize = 1024

def __init__(self, host):

"""

构造

"""

super().__init__()

self.__socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# self.__id = None

self.__nickname = None

self.__host = host

self.thread_recv = None

self.threadisalive = False

# 是否在接收文件

self.recvfile = False

# 是否在发送文件

self.sendfile = False

self.filesize = None

self.sendfilesize = None

# 接收文件包计数

self.filecount = None

# 接收文件名

self.filename = None

# 发送文件名

self.sendfilename = None

# 发送者

self.filefrom = None

# 接收者

self.fileto = None

# 接收文件流

self.file_recv = None

# 发送文件流

self.file_send = None

# 接收文件地址

self.filefrom_addr = None

# 发送文件地址

self.fileto_addr = None

def __receive_message_thread(self):

"""

接受消息线程

"""

while self.threadisalive:

# noinspection PyBroadException

try:

buffer, addr = self.__socket.recvfrom(1024)

'''

文件流由发送端直接发送,不经过服务器,故当发送端发来的消息时,将收到的数据存入文件

'''

if (addr != self.__host) & (addr == self.filefrom_addr) & self.recvfile:

self.file_recv.write(buffer)

self.filecount += 1

if self.filecount * 1024 >= self.filesize:

self.file_recv.close()

print(self.filename, 'is received.')

self.recvfile = False

continue

js = json.loads(buffer.decode())

# 若接收的数据为消息信息,则显示

if js['type'] == 'message':

print(js['message'])

# 若接收的数据为文件发送请求,则存储文件信息,并显示

elif js['type'] == 'filequest':

if self.recvfile:

self.__socket.sendto(json.dumps({

'type': 'fileres',

'fileres': 'no',

'nickname': self.__nickname,

'who': js['nickname'],

'errormessage': 'is transfroming files.',

}).encode(), self.__host)

continue

filename = js['filename']

who = js['nickname']

filesize = js['filesize']

self.recvfile = True

self.filesize = filesize

self.filename = filename

self.filecount = 0

self.filefrom = who

self.filefrom_addr = (js['send_ip'], js['send_port'])

print('[system]:', who, ' send

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要设计一个基于 Python 的 GUI 聊天室,需要使用一些库和框架来实现。下面是一些可能用到的库和框架: - Tkinter:Python 自带的 GUI 库,可以用来创建窗口、按钮、文本框等界面元素。 - Socket:用于建立 TCP 或 UDP 连接,以便客户端和服务器之间进行通信。 - Threading:用于在代码中创建多个线程,以便同时处理多个连接。 - Pickle:用于在客户端和服务器之间传递 Python 对象。 下面是一个简单的步骤,可以帮助你开始设计一个基于 Python 的 GUI 聊天室: 1. 创建一个主窗口,窗口中包含一个文本框用于显示聊天记录,一个输入框和一个发送按钮,用于输入和发送消息。 2. 写一个函数,用于连接服务器。在函数中,使用 socket 库创建一个 TCP 连接,将服务器地址和端口号传递给它。如果连接成功,则返回一个 socket 对象。 3. 写一个函数,用于接收消息。在函数中,使用 socket 对象的 recv() 方法从服务器接收消息。将接收到的消息添加到文本框中显示。 4. 写一个函数,用于发送消息。在函数中,使用 socket 对象的 send() 方法将消息发送到服务器。 5. 在主窗口的发送按钮上绑定发送消息函数。 6. 在程序中创建一个新的线程,用于接收消息。在线程中,不断循环调用接收消息函数,以便及时处理从服务器接收到的消息。 这些步骤只是一个基本的框架,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值