多人聊天(附源代码)

简单实现多人聊天:
1:启动服务器
2:启动客户端
3:服务器用集合来接收客户
4:客户端发送信息
5:服务器接收客户端消息
6:服务器发送给其他客户端
7:其他客户端接收服务器消息

思路总结:运用网络读写包,客户端发送消息,通过服务器转发给其他客户端,其他客户端接收服务器消息就可以简单实现多人聊天

运用到的知识点:网络包,io读写流,多线程

/*
* 服务器
* */
public class Gwa {
    public static void main(String[] args) throws Exception {
        //启动服务器
        ServerSocket ss=new ServerSocket(1122);
        System.out.println("服务器已启动,等待客户端上线");

        Vector<Socket> vc=new Vector<Socket>();
        while (true){
            Socket sk= ss.accept();
            vc.add(sk);
            //服务器线程
            new Ss1(sk,vc).start();
        }


    }
/*
* 客户端
* */
public class Myc {
    public static void main(String[] args) throws Exception{
        Socket sk=new Socket(InetAddress.getByName("127.0.0.1"),1122);
        System.out.println("已上线");

        new read(sk).start();

        new wread(sk).start();



    }
/*
* 写入
* */
public class wread extends Thread{
    private Socket sk=null;

    public wread(Socket sk) {
        this.sk = sk;
    }
            Scanner may=new Scanner(System.in);
    @Override
    public void run() {
        while (true){
            try {
                //写
                OutputStream os= sk.getOutputStream();
                OutputStreamWriter osw=new OutputStreamWriter(os);
                BufferedWriter bw=new BufferedWriter(osw);
                System.out.println("请输入你要发送的消息:");
                String str=may.next();

                if(str!=null){
                    bw.write(str);
                    bw.newLine();
                    bw.flush();
                }
                if("bye".equals(str)){
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
/*
* 转发
* */
public class Ss1 extends Thread {
    Socket sk=null;
    Vector<Socket> vc=null;
    //使用集合来接收客户端
    public Ss1(Socket sk, Vector<Socket> vc) {
        this.sk=sk;
        this.vc=vc;
    }

    @Override
    public void run() {
        while (true){
            try {
                //读
                InputStream is= sk.getInputStream();
                InputStreamReader isr=new InputStreamReader(is);
                BufferedReader br=new BufferedReader(isr);
                String str=br.readLine();

                for (Socket s:vc) {
                    if(s!=null){
                        if(s!=sk){
                            //写
                            OutputStream os= s.getOutputStream();
                            OutputStreamWriter osw=new OutputStreamWriter(os);
                            BufferedWriter bw=new BufferedWriter(osw);
                            bw.write(str);
                            bw.newLine();
                            bw.flush();

                        }
                    }
                }
                if("bye".equals(str)){
                    sk.close();//发送消息
                    br.close();//读取消息
                    vc.remove(sk);//下线
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
/*
* 读取
* */
public class read extends Thread{
    private Socket sk=null;

    public read(Socket sk) {
        this.sk = sk;
    }

    @Override
    public void run() {
        while (true){
            try {
                //读
                InputStream is=sk.getInputStream();
                InputStreamReader isr=new InputStreamReader(is);
                BufferedReader br=new BufferedReader(isr);
                String str=br.readLine();
                System.out.println("\t收到消息:"+str);


            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
Python中实现多人聊天室的一个常见方法是使用网络编程库,如socket、asyncio或者websockets,结合基本的并发和多线程技术。这里我提供一个简单的概念性的框架: ```python import asyncio import websockets # 假设我们有一个简单的用户连接管理类 class ChatRoom: def __init__(self): self.users = set() self.messages = {} async def add_user(self, user): self.users.add(user) await self.broadcast(f"{user} has joined the chat.") async def remove_user(self, user): self.users.remove(user) await self.broadcast(f"{user} has left the chat.") async def send_message(self, sender, message): self.messages[(sender,)] = message await self.broadcast(f"Message from {sender}: {message}") async def broadcast(self, message): for user in self.users: await user.send(message) # 这是客户端连接的处理 class UserWebSocket: def __init__(self, websocket, user_id): self.websocket = websocket self.user_id = user_id self.room = ChatRoom() async def send(self, message): await self.websocket.send(message) async def receive(self): message = await self.websocket.recv() # 处理收到的消息(如解析和转发到对应函数) # 主程序 async def main(): async with websockets.serve(handle_client, "localhost", 8765): print("Chat server is running on http://localhost:8765") await asyncio.Future() # 阻塞直到所有连接关闭 async def handle_client(websocket, path): user_id = f"user_{len(ChatRoom.users) + 1}" user = UserWebSocket(websocket, user_id) ChatRoom().add_user(user) try: async for message in user.websocket: await user.room.send_message(user.user_id, message) finally: ChatRoom().remove_user(user) if __name__ == "__main__": asyncio.run(main()) ``` 这是一个非常基础的例子,实际项目中可能需要更复杂的错误处理、消息格式化、身份验证等功能。相关问题: 1. 如何在实际应用中增加用户验证功能? 2. 在多人聊天中,如何保证消息的实时性和同步性? 3. 如何扩展这个聊天室以支持私聊或频道分组?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值