Java ServerSocket 实现聊天室功能(简易版)
2026/7/28 16:43:38 网站建设 项目流程
大体实现功能可以选择房间,可以与房间中的用户进行实时的交流


说在前面的话:

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

  1. 用户连接上服务器后选择房间号,进入房间。进入房间后会向房间中所有的用户打印出用户进入房间的提醒。
  2. 用户进入房间后,输入姓名即可发言。
  1. 说起来很简单,代码实现更简单。我们需要一个保存房间用户的容器。我这里使用的是。
// 保存聊天室中的用户数据privatestaticMap<String,List<Map<String,PrintWriter>>>charScnnerMap=newHashMap<>();
  1. 使用 try-with-resource 语法防止出现资源未关闭的情况出现。
  2. 直接上代码
packagecom.annie;importcom.sun.org.apache.xml.internal.resolver.readers.ExtendedXMLCatalogReader;importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.*;publicclassApp{// 保存聊天室中的用户数据privatestaticMap<String,List<Map<String,PrintWriter>>>charScnnerMap=newHashMap<>();publicstaticvoidprint(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);}}}publicstaticvoidmain(String[]args)throwsInterruptedException{charScnnerMap.put("1",newArrayList<Map<String,PrintWriter>>());charScnnerMap.put("2",newArrayList<Map<String,PrintWriter>>());charScnnerMap.put("3",newArrayList<Map<String,PrintWriter>>());// 监控本机端口 9189try(ServerSocket serverSocket=newServerSocket(9189)){while(true){Socket accept=serverSocket.accept();newThread(()->{try(InputStream inputStream=accept.getInputStream();OutputStream outputStream=accept.getOutputStream();Scanner scanner=newScanner(inputStream,"UTF-8");PrintWriter out=newPrintWriter(newOutputStreamWriter(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=newHashMap<>();m.put(name,out);charNames.add(m);// 打印内容print(charNames,"Welcome ["+name+"] to the room.");booleanb=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(Exceptione){e.printStackTrace();}}).start();}}catch(IOExceptione){e.printStackTrace();}}}

扩展内容
github
个人博客

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询