美文网首页
python、多线程和socket实现聊天室功能

python、多线程和socket实现聊天室功能

作者: Z_JoonGi | 来源:发表于2019-04-05 18:28 被阅读0次

服务器部分代码:

from threading import Thread, Lock
import socket


class Server:
    def __init__(self, ip_addr="192.168.0.103", port_num = 8080):
        self.ip_addr = ip_addr
        self.port_num = port_num
        self.cnt = []
        self.lock = Lock()

    def start_sever(self):
        """启动服务器,并开始监听,每当连接一个客户端,便为他创建一个对应的子线程"""
        server = socket.socket()
        server.bind((self.ip_addr, self.port_num))
        server.listen(1024)
        welcome = "欢迎来到JoonGi的聊天室"
        while True:
            connect, addr = server.accept()
            connect.send(welcome.encode(encoding="utf-8"))
            self.cnt.append({'obj': connect, 'addr': addr})
            recv = Thread(target=self.recv_message, args=(connect,addr))
            recv.start()

    def recv_message(self, connect, addr):
        """子线程函数:接收消息,并广播消息给每个连接的客户端"""
        while True:
            data = connect.recv(1024)
            msg =data.decode(encoding="utf-8")
            self.lock.acquire()
            self.lock.release()
            print(msg)
            for c in self.cnt:
                c['obj'].send(msg.encode(encoding="utf-8"))
            if data.decode(encoding="utf-8") =="拜拜":
                self.cnt.remove({'obj': connect, 'addr': addr})
                break
        connect.close()


def main():
    server = Server()
    server.start_sever()


if __name__ == "__main__":
    main()

客户端部分代码:

import socket
from threading import Thread, Lock
import datetime

class Client:
    def __init__(self, name, address):
        self.name = name
        self.addr = address
        self.lock = Lock()

    def start_client(self):
        client = socket.socket()
        client.connect(self.addr)
        """创建一个接收消息的子线程"""
        recv = Thread(target=self.recv_msg, args=(client,))
        recv.start()
        while True:
            msg = input()
            msgs =str(datetime.datetime.now())[:-7]+'  '+ self.name + ":" + msg
            client.send(msgs.encode(encoding="utf-8"))
            if "拜拜" in msg:
                break
        client.close()


    def recv_msg(self, client):
        """接收消息的子线程函数"""
        while True:
            data = client.recv(1024).decode(encoding='utf-8')
            print(data)



def main():
    client = Client("小红", ('192.168.0.103', 8080))
    client.start_client()


if __name__ == "__main__":
    main()

服务器端界面展示

2019-04-05 18:25:40  小红:你们好
2019-04-05 18:25:52  小张:大家好
2019-04-05 18:26:02  小红:你们最近怎么样
2019-04-05 18:26:19  小张:I'm fine,thank you
2019-04-05 18:26:32  小红:好哒
2019-04-05 18:26:42  小张:那就拜拜啦
2019-04-05 18:26:48  小红:拜拜

客户端1:

欢迎来到JoonGi的聊天室
你们好
2019-04-05 18:25:40  小红:你们好
2019-04-05 18:25:52  小张:大家好
你们最近怎么样
2019-04-05 18:26:02  小红:你们最近怎么样
2019-04-05 18:26:19  小张:I'm fine,thank you
好哒
2019-04-05 18:26:32  小红:好哒
2019-04-05 18:26:42  小张:那就拜拜啦
拜拜

客户端2:

欢迎来到JoonGi的聊天室
大家好
2019-04-05 18:25:52  小张:大家好
2019-04-05 18:26:02  小红:你们最近怎么样
I'm fine,thank you
2019-04-05 18:26:19  小张:I'm fine,thank you
2019-04-05 18:26:32  小红:好哒
那就拜拜啦

相关文章

网友评论

      本文标题:python、多线程和socket实现聊天室功能

      本文链接:https://www.haomeiwen.com/subject/nxjkiqtx.html