[java]JavaSE基础小项目:校园多人畅聊系统

这是一个基于JavaSE的小项目,从名字我们也能看出来这是个多人聊天系统。下面记录一下整个项目的功能,设计思想以及所用到的知识,大家有兴趣的话,也可以自己尝试练习一下,也算是对SE的复习。

  • 项目名称:校园多人畅聊系统
  • 项目描述:支持多人群聊、私聊的网络聊天系统
  • 使用技术:Java基础、Socket编程
  • 项目功能:
    • 注册
    • 私聊
    • 群聊
    • 退出
  • 项目实现:
    • 服务端:采用线程池调度执行服务器与客户端业务处理逻辑
    • 客户端: 采用读写线程,分别处理交互服务与服务器数据接收

以上是项目总体的介绍,下面我们具体明确一下服务器端与客户端的实现:
服务器端实现:
1,维护功能:维护所有在线的客户端
2,注册功能:将客户端注册名称添加到服务器的客户端集合里
3,群聊功能:客户端发送消息,其余所有客户端都能接收到消息
4,私聊功能:客户端与指定客户端发送和接收数据
5,退出功能:从服务器客户端集合中移除客户端
客户端实现:
1,注册功能:创建Socket,给服务器发送注册执行
2,群聊功能:给客户端发送和接收数据
3,私聊功能:客户端指定客户端(用户)发送数据
4,退出功能:给服务器发送退出指令(消息)

由于我们项目中用到了一些Socket编程的知识,简单说一下我们项目中用到的一些Socket知识:
ServerSocket :基站类,服务器Socket类
public ServerSocket(int port):在本机根据指定端口号创建服务器
public Socket accept():侦听并接收连接到本服务的客户端连接
此方法会一直阻塞,直到有一个客户端成功连接,返回此连接。

Socket:客户端类
public Socket(String host,int port):
根据指定Ip和端口号创建套接字并连接到远程服务器端
public InputStream getInputStream() 返回此套接字的输入流
public OutputStream getOutputStream() 返回此套接字的输出流
有了以上方法就足以应对我们这个项目了。

第一步:要实现通信功能,我们要做的就是要让客户端能和服务器进行连接
我们将自己想象成一个服务器,我们应该先开启连接功能,但具体有谁来链接我,我事先并不会知道。因此我可以把我的ip地址和端口号告诉大家,如果有谁想要来连接,拿着我的ip地址和端口号向我发送连接请求就行。
第二步,我们是一个多人聊天系统,自然不可能是一个单线程的,如果是单线程那就是大家轮流和服务器聊天,一个聊完了换下一个人。显然我们需要用到多线程,要维护这么多线程,自然需要用到线程池,而线程池有四种启动方式,分析一下,我们决定采用一个固定线程大小的线程池来控制客户端的连接数量。这里我采用的是10个,具体数量大家可以根据自己的情况修改。只要你的电脑够好。

//多线程服务器端
public class MultiThreadServer {
    public static void main(String[] args) {
        // 创建线程池,保存多个客户端各自的线程
        final ExecutorService executorService = Executors.newFixedThreadPool(10);
        try {
            ServerSocket serverSocket = new ServerSocket(6666);
            System.out.println("服务器启动..."+serverSocket.getLocalSocketAddress());
            // 等待不同线程连接
            System.out.println("等待客户端连接");
            while(true){
            Socket client = serverSocket.accept();
            executorService.submit(new ExecuteClient(client));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

第三步:服务器建立好连接后,就需要等待客户端来连接了。客户端自然不会说只是连接了服务器就好了,还需要向服务器发送数据和从服务器读取数据。考虑到读、写这两个过程是可以同时进行的,因此我们可以把客户端的读、写过程用两个线程来实现,以提高效率。

public class MultiThreadClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",6666);
            // 1.往服务器发送数据
            new WriteDataToServer(socket).start();
            // 2.从服务读取数据
            new ReadDateFromServer(socket).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

第四步:建立好连接,客户端就可以向服务器发送消息了:这部分就比较简单了,只是普通的IO操作。读取服务器消息也是一样的操作。

public class WriteDataToServer extends Thread{
    private final Socket client;
    public WriteDataToServer(Socket client) {
        this.client = client;
    }
    @Override
    public void run() {
        try {
            OutputStream clientOutput = client.getOutputStream();
            OutputStreamWriter writer = new OutputStreamWriter(clientOutput);
            Scanner scanner = new Scanner(System.in);
            while(true){
                System.out.println("请输入消息");
                String message = scanner.nextLine();
                writer.write(message+"\n");
                writer.flush();
                if(message.equals("bye")){
                    // 表示客户端要关闭
                    client.close();
                    break; //没有这个,bye时,read会有异常,因为已知在while里等待输入
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

第五步:由于目前我们是在控制台进行聊天的,并没有可视化界面,有按钮可以让你选择群聊私聊等。因此我们在这里规定一下格式:
* 1.注册:userName:< name >
* 2.私聊:private:< name > : < message >
* 3.群聊:group:< message >
* 4.退出:bye
在明确了格式之后,我们服务器就可以对这些消息进行处理了
我们接收到客户端的消息,先提取出用户想要做什么事情,通过匹配不同的格式,对客户端进行不同的处理。代码在次不做粘贴了。

整个项目源码地址:
校园多人畅聊系统

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章