基于Java Socket的多人在线聊天

上一篇: Java Socket 基于UDP协议的多线程连接

  1. 思路:
    • 所有人都访问一个地址和端口号
    • 用户接受消息都单独放在一个开启了线程的类里面
    • 在主方法Client里面调用这两个线程类
    • 服务器用一个List集合来保存连接的用户Socket连接,并且用一个不终止
    • 的循环不断开启线程来接受和发送Socket消息,接受一个Socket
    • 连接后,将Socket保存在List集合中,并且将消息发送给非当前发送消
    • 息用户的用户Socket。这样简单的实现类多人Socket聊天,相当于一
    • QQ讨论组一样的形式.
  2. 项目结构
    这里写图片描述

  3. ThreadWriter.java源码

    package cjj.online.cn;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.Scanner;
    
    /**
    *@author:蔡佳君
    *@date:2017年12月7日 上午10:57:34
    *@version:
    *@description:用户输入,保存到socket中去
    */
    public class ThreadWriter extends Thread{
        Socket socket;
        public ThreadWriter(Socket socket) {
            this.socket = socket;
        }
    
        public void run() {
            try {
                Scanner sc = new Scanner(System.in);
                int i = 0;
                while(true) {
                    System.out.println("第的" + i++ + "条消息:");
                    String str = sc.next();
                    OutputStream os = socket.getOutputStream();
                    //将输入的字符写入到利用输出流写到socket中保存
                    os.write(str.getBytes());
                } 
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
  4. TheadReader.java源码

     package cjj.online.cn;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.ArrayList;
    
    /**
    *@author:蔡佳君
    *@date:2017年12月7日 上午11:04:50
    *@version:
    *@description:
    */
    public class TheadReader extends Thread{
    
        Socket socket;
        public TheadReader(Socket socket) {
            this.socket = socket;
        }
        @Override
        public void run() {
            try {
                while(true) {
                        //利用输出流得到socket中的消息.
                        InputStream is = socket.getInputStream();
                        byte[] b = new byte[1024];
                        //读取到字节b中,并获取字节的个数。
                        int len = is.read(b);
                        //转化为字符
                        String str = new String(b,0,len);
                        System.out.println(str);   
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            super.run();
        }
    }
    
  5. ServerThread.java源码

    package cjj.online.cn;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.ArrayList;
    
    /**
    *@author:蔡佳君
    *@date:2017年12月7日 上午10:31:09
    *@version:
    *@description:有多个客户端时,就会开启多个socket连接,
    *得到发送socket消息的socket。发送给其他未发送socket消息的
    *客户端
    */
    public class ServerThread extends Thread{
    
        Socket socket;
        ArrayList<Socket> list;
        InputStream is;
        OutputStream os;
        public ServerThread(Socket socket,ArrayList<Socket> list) {
            this.socket = socket;
            this.list = list;
        }
        @Override
        public void run() {
            try {
                while(true) {
                    //得到一个客户端的消息
                    is = socket.getInputStream();
                    byte[] b = new byte[1024];
                    int len = is.read(b);
                    String str = new String(b,0,len);
                    System.out.println(str);
                    for(Socket socket:list) {
                        //避免socket消息自己发给自己
                        if(this.socket != socket) {
                            os = socket.getOutputStream();
                            //输出流 写到socket中去
                            os.write(str.getBytes());
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        }
    
  6. Client.java, Server.java源码

    package cjj.online.cn;
    import java.io.IOException;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    /**
    *@author:蔡佳君
    *@date:2017年12月7日 上午10:56:37
    *@version:
    *@description:
    */
    public class Client {
    
        public static void main(String[] args) throws Exception {
            Socket socket = new Socket("127.0.0.1",8888);
            new ThreadWriter(socket).start();
            new TheadReader(socket).start();
        }
    
    }
    -------------------------------------------------------------
    package cjj.online.cn;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    
    /**
    *@author:蔡佳君
    *@date:2017年12月7日 上午10:27:43
    *@version:
    *@description:
    */
    public class Server {
        private static ArrayList<Socket> list = new ArrayList<Socket>();
        public static void main(String[] args) throws IOException {
            @SuppressWarnings("resource")
            ServerSocket server = new ServerSocket(8888);
            while(true) {
                //如果队列中没有等待的连接,套接字也没有被标记为Non-blocking,accept()会阻塞调用函数直到连接出现
                Socket socket = server.accept();
                //将连接的socket放到一个list集合
                list.add(socket);
                new ServerThread(socket,list).start();
            }
        }
    
    }
    
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java SocketJava程序员使用的一种网络编程方式,它可以实现多种互相通信的方式,其中包括私聊和多人聊天。在Java Socket中,实现私聊和多人聊天的方式主要是基于客户端-服务器模型,即一个服务器可以同时连接多个客户端,客户端与客户端之间也可以直接互相通信。 实现Java Socket私聊和多人聊天的图形化界面,可以采用Java Swing和JavaFX两种方式。Java Swing是Java标准库中提供的一种GUI框架,被广泛应用于Java桌面应用程序开发中;而JavaFX则是Java平台中最新的、专门为Java应用程序创建现代化用户界面(UI)而设计的框架。它们都可以用于构建高效并美观的网络聊天软件界面。 在实现Java Socket私聊和多人聊天图形化界面时,主要需要考虑以下方面: 1. 客户端和服务器端界面设计,需要便于用户操作和界面整洁美观。 2. 客户端连接和控制模块需实现,以便用户打开程序即可连接到服务端,并能够进行信息的发送和接收。 3. 合理安排服务器端的处理逻辑,例如多路复用技术、负载均衡、消息队列等,防止因连接数过多而导致的服务器压力过大。 4. 程序应该具备良好的可扩展性,以便未来增加更多功能,如加入聊天室等。 总之,Java Socket私聊和多人聊天图形化界面需要良好的设计和高效的实现,才能提供更好的用户体验和有效的沟通。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值