基于python的聊天室

基于python的聊天室

1.server

server用于中转消息,如果想要实现真实的聊天室,必须将server的ip设置为云服务,或者公网ip


from socket import *
from select import select

def main():
    'main 主函数'
    server = socket(AF_INET, SOCK_STREAM)  # 建立TCP套接字
    server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)  # 设置端口可立即重用
    ADDR = '127.0.0.1', 5555
    server.bind(ADDR)  # 绑定地址
    server.listen()  # 监听
    # 接收函数
    accept(server)


def accept(server):
    'accept 服务器接受函数'
    # 使用select模块的select方法实现IO多路复用监听传输
    rlist = [server]
    wlist = []
    xlist = []

    while True:
        rs, ws, xs = select(rlist, wlist, xlist)
        for r in rs:
            # 服务器接受客户端连接
            if r is server:
                try:
                    conn, addr = server.accept()
                    welcome(conn)
                    # 将客户端套接字添加到rlist中以监听
                    rlist.append(conn)
                    print("链接从:", addr)
                except:
                    pass

            else: # 服务器接受客户端的消息并转发给所有客户端
                try:
                    data = r.recv(1024)
                    # 转发信息给其他客户端
                    data = b'\n' + data + b'\n'
                    print(data.decode(), end='')
                    for c in rlist[1:]:
                        if c is not r:
                            c.send(data)
                except:
                    rlist.remove(r)

def welcome(client):
    client.send(b'Welcome! \n')
    return True

if __name__ == '__main__':
    # 主函数
    main()

2. client1

import os, sys
import threading
from socket import *
from select import select

def main():
    'main 主函数'
    client = socket(AF_INET, SOCK_STREAM)  # 建立TCP套接字
    if login(client):
        t_recv = threading.Thread(target=recv, args=(client,))
        t_send = threading.Thread(target=send_msg, args=(client,))
        t_recv.start()
        t_send.start()

def send_msg(client):
    while True:
        send_data = input("请输入要发送的数据:")
        send_data = username + ":" +send_data
        client.send(send_data.encode("utf-8"))

def recv(client):
    # 使用select模块的select方法实现IO多路复用监听传输
    rlist = [client]
    wlist = []
    xlist = []

    while True:
        rs, ws, xs = select(rlist, wlist, xlist)
        for r in rs:
            if r is client:
                # 接受服务器发来的消息
                data = client.recv(1024)
                if data.decode() == '\n':
                    # 如果消息为回车,聊天室关闭
                    client.close()
                    os._exit(0)
                else:
                    # 打印接收到的信息
                    print(data.decode(), end='')

def login(client):
    '登录函数 login'
    curuser = input('输入名称>')
    global username
    username = curuser
    ADDR = '127.0.0.1', 5555
    client.connect(ADDR)  # 连接到服务器地址
    data = curuser + ': ' + "进入房间"
    client.send(data.encode())
    return True

if __name__ == '__main__':
    main()

3.client2

import os, sys
import threading
from socket import *
from select import select

def main():
    'main 主函数'
    client = socket(AF_INET, SOCK_STREAM)  # 建立TCP套接字
    if login(client):
        t_recv = threading.Thread(target=recv, args=(client,))
        t_send = threading.Thread(target=send_msg, args=(client,))
        t_recv.start()
        t_send.start()

def send_msg(client):
    while True:
        send_data = input("请输入要发送的数据:")
        send_data = username + ":" +send_data
        client.send(send_data.encode("utf-8"))

def recv(client):
    # 使用select模块的select方法实现IO多路复用监听传输
    rlist = [client]
    wlist = []
    xlist = []

    while True:
        rs, ws, xs = select(rlist, wlist, xlist)
        for r in rs:
            if r is client:
                # 接受服务器发来的消息
                data = client.recv(1024)
                if data.decode() == '\n':
                    # 如果消息为回车,聊天室关闭
                    client.close()
                    os._exit(0)
                else:
                    # 打印接收到的信息
                    print(data.decode(), end='')

def login(client):
    '登录函数 login'
    curuser = input('输入名称>')
    global username
    username = curuser
    ADDR = '127.0.0.1', 5555
    client.connect(ADDR)  # 连接到服务器地址
    data = curuser + ': ' + "进入房间"
    client.send(data.encode())
    return True

if __name__ == '__main__':
    main()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值