美文网首页Java web
Java ServerSocket 实现聊天室功能(简易版)

Java ServerSocket 实现聊天室功能(简易版)

作者: YUNDONG丶 | 来源:发表于2019-08-26 10:44 被阅读0次

大体实现功能可以选择房间,可以与房间中的用户进行实时的交流


说在前面的话:

serverSocket.accept() 会形成阻塞
scanner.hasNextLine() 和 scanner.nextLine() 也会形成阻塞
windows 下需要打开telnet服务。请自行百度
实现思路:

  1. 用户连接上服务器后选择房间号,进入房间。进入房间后会向房间中所有的用户打印出用户进入房间的提醒。
  2. 用户进入房间后,输入姓名即可发言。
  1. 说起来很简单,代码实现更简单。我们需要一个保存房间用户的容器。我这里使用的是。
    // 保存聊天室中的用户数据
    private static Map<String, List<Map<String, PrintWriter>>> charScnnerMap = new HashMap<>();
  1. 使用 try-with-resource 语法防止出现资源未关闭的情况出现。
  2. 直接上代码
package com.annie;

import com.sun.org.apache.xml.internal.resolver.readers.ExtendedXMLCatalogReader;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;

public class App {

    // 保存聊天室中的用户数据
    private static Map<String, List<Map<String, PrintWriter>>> charScnnerMap = new HashMap<>();

    public static void print(List<Map<String, PrintWriter>> charNames, String conn) {
        for (Map<String, PrintWriter> charName : charNames) {
            Set<Map.Entry<String, PrintWriter>> entries = charName.entrySet();
            for (Map.Entry<String, PrintWriter> entry : entries) {
                entry.getValue().println(conn);
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        charScnnerMap.put("1", new ArrayList<Map<String, PrintWriter>>());
        charScnnerMap.put("2", new ArrayList<Map<String, PrintWriter>>());
        charScnnerMap.put("3", new ArrayList<Map<String, PrintWriter>>());



        // 监控本机端口 9189
        try (ServerSocket serverSocket = new ServerSocket(9189)) {
            while (true) {
                Socket accept = serverSocket.accept();
                new Thread(() -> {
                    try (InputStream inputStream = accept.getInputStream();
                         OutputStream outputStream = accept.getOutputStream();
                         Scanner scanner = new Scanner(inputStream, "UTF-8");
                         PrintWriter out = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true)) {


                        // 定位房间
                        String number = "-1";
                        out.println("Please enter the room number.(1-3): ");
                        number = scanner.nextLine();
                        if (!number.equals("1") && !number.equals("2") && !number.equals("3")) {
                            while (true) {
                                out.println("Please enter the correct room.(1-3): ");
                                number = scanner.nextLine();
                                if (number.equals("1") || number.equals("2") || number.equals("3")) {
                                    break;
                                }
                            }
                        }

                        // 显示姓名
                        out.println("Please enter your name: ");
                        String name = scanner.nextLine();
                        List<Map<String, PrintWriter>> charNames = charScnnerMap.get(number);
                        Map<String, PrintWriter> m = new HashMap<>();
                        m.put(name, out);
                        charNames.add(m);

                        // 打印内容
                        print(charNames, "Welcome [" + name + "] to the room.");

                        boolean b = true;
                        while (b && scanner.hasNextLine()) {
                            String s = scanner.nextLine();
                            print(charNames, name + ": " + s);

                            if (s.equals("BB")) {
                                print(charNames, "[" + name + "]Exit the room");
                                b = false;
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
结尾:如果您觉得这边文章对您有帮助,麻烦\color{red}{点赞}\color{red}{评论}\color{red}{评论}。您的支持是对笔者的最大帮助😘😘😘

扩展内容
github
个人博客

相关文章

  • Java ServerSocket 实现聊天室功能(简易版)

    大体实现功能可以选择房间,可以与房间中的用户进行实时的交流 说在前面的话: serverSocket.accept...

  • 1、看!源码之ServerSocket实现

    1、ServerSocket实现 本章将以源码形式介绍ServerSocket的实现,并且会将它内部它所实现的方法...

  • 1.普通Socket的用法

    Java中网络通信是通过Socket实现的。Socket分为ServerSocket和Socket两大类。Serv...

  • MFC&Python_QQIM

    QQ即时通讯及聊天室 实现功能:1、客户端可以和服务端进行通讯2、服务端支持多人聊天实现聊天室功能3、界面的友好度...

  • 基于SpringBoot、STOMP使用WebSocket实现聊

    原文连接: 基于SpringBoot、STOMP使用WebSocket实现聊天室功能 WebSocket: 新项...

  • Java Socket通信

    目标 Demo是通过Java ServerSocket 和 Socket 通信实现客户端发送消息和发送文件到服务器...

  • SDWebImage源码

    自从自己尝试了书写简易版的SDWebImage框架功能,到近日查看该源码, 感觉SD实现的思路和自己的简易版差不多...

  • 直播聊天室大并发消息处理

    最近在做直播间的聊天室,踩了很多坑,我们采用的是融云的IM,实现聊天室的功能,所有的直播间功能都通过消息进行...

  • 创建一个 BIO server

    在 Java 中使用 java.net.Socket 和 java.net.ServerSocket 操作套接字。...

  • 2020-10-24 Java 网络

    主要在java.net.Socket,java.net.ServerSocket,java.net.URL,Jav...

网友评论

    本文标题:Java ServerSocket 实现聊天室功能(简易版)

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