用Python 实现 简易多人聊天软件(类似于QQ原型)

一、设计思路:

通过引入socket模块,threading模块,生成服务器端和客户端代码,分别打包成两个EXE文件,将服务器EXE运行于服务器端(可以在阿里云申请试用的云服务器)实现简单的多人聊天室功能。

二、客户端:

客户端代码思路:

主线程:1)连接服务器 2)开一个线程,接收消息 3)循环给服务器发消息

子线程:不断接收消息

from socket import *
import threading

s = socket()
s.connect(('自己的服务器公网IP', 8888))

name = input('请给自己取一个昵称:')
s.send(name.encode())


# 子线程
def recv_msg(s):
    while True:
        print(s.recv(2048).decode())


threading.Thread(target=recv_msg, args=(s,)).start()

# 主线程  给服务器发消息
while True:
    s.send(input('').encode())

三、服务器端:

服务器端代码思路:

主线程:1)搭建IP和端口 开启监听   2)不断接收客户端链接,接到一个开一个线程

  1. 子线程:接收客户端消息并不断给所有客户端发送
from socket import *
import threading

# 搭建服务器开启监听,等待客户端连接
S = socket()
S.bind((gethostname(), 8888))
S.listen()
# s是分机号,addr是IP地址和端口
s, addr = S.accept()

s_list = []  # 定义一个列表保存客户端数据
n_list = []  # 定义一个列表保存名字


# 判断是否下线
def read_client(s, n):
    try:
        return s.recv(2048).decode()
    except:
        print(f'{n}离开了聊天室!')
        s_list.remove(s)
        s.close()
        n_list.remove(n)
        print(n_list)


# 线程(分身)执行代码
def target_fun(s, n):
    # 接收客户端消息转发给所有客户端
    while True:
        msg = read_client(s, n)
        if msg is None:  # 读取到的信息没有
            break
        else:
            print(f'【{n}】说: {msg}')
            # 转发给所有客户端
            for ss in s_list:
                ss.send(f'【{n}】说: {msg}'.encode())


# 主线程 接收客户端连接,给每个客户端开线程分身
while True:
    s, addr = S.accept()
    s_list.append(s)

    name = s.recv(1024).decode()
    print(f'{name}进入了聊天室!')
    n_list.append(name)
    # 开线程分身        干嘛去             和谁去
    threading.Thread(target=target_fun, args=(s, name)).start()

S.close()

四、服务器设置

阿里云服务器   ——控制台—— 安全组—— 管理规则—— 手动添加——  开启8888端口号

#把客户端代码里面的ip地址改成云服务器的IP地址

五、去尝试下吧!构建自己的私密聊天软件!

你可能感兴趣的:(python)