Socket聊天室

  • 1 创建登录判断类UserLogin
  • 2 创建登录服务器LoginServer
  • 3 创建聊天服务器ChatServer
  • 4 创建客户端Client
  • 5 创建服务器用于处理聊天的线程类ChatThread
  • 6 创建客户端Client用于发送消息的线程类WriteThread
  • 7 创建客户端Client用于接收消息的线程类ReadThread
  • 8 测试
    • 8.1 登录
    • 8.2 群聊
    • 8.2 单聊

1 创建登录判断类UserLogin

import java.util.HashSet;
import java.util.Set;public class UserLogin {public static boolean login(String username) {Set<String> set = initUser();// set中含有该username则登录成功return set.contains(username);}public static Set<String> initUser() {Set<String> set = new HashSet<>();set.add("111");set.add("222");set.add("333");set.add("444");set.add("555");return set;}
}

2 创建登录服务器LoginServer

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class LoginServer {public static void main(String[] args) {int port = 6666;try (ServerSocket serverSocket = new ServerSocket(port)) {System.out.println("登录服务器已经启动");while (true) {Socket socket = serverSocket.accept();// 接收Client输出的信息(username)InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String username = bufferedReader.readLine();// 调用登录方法,判断是否成功登录OutputStream outputStream = socket.getOutputStream();PrintStream printStream = new PrintStream(outputStream);if (UserLogin.login(username)) {System.out.println(username + "登录成功");// 登录成功输出"true"到ClientprintStream.println("true");} else {System.out.println(username + "登录失败");// 登录失败则输出"false"到ClientprintStream.println("false");}printStream.flush();}} catch (IOException e) {e.printStackTrace();}}
}

3 创建聊天服务器ChatServer

import com.socket.socketChatroom.bio.thread.ChatThread;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;public class ChatServer {// 保存当前聊天中的所有Map<username,Socket>public static Map<String, Socket> socketMap = new HashMap<>();public static void main(String[] args) {int port = 9999;try (ServerSocket serverSocket = new ServerSocket(port)) {System.out.println("聊天服务器已经启动");while (true) {Socket socket = serverSocket.accept();// 接收Client输出的usernameInputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String username = bufferedReader.readLine();System.out.println(username + "连接到聊天服务器");// 连接聊天服务器成功则将它的<username,Socket>放入socketMap中socketMap.put(username, socket);System.out.println(socketMap);// 因为可能有多个Client与ChatServer进行交互,所以一旦有Client连接成功就新创建一个线程与之交互new ChatThread(username,socket).start();}} catch (IOException e) {throw new RuntimeException(e);}}
}

4 创建客户端Client

import com.socket.socketChatroom.bio.thread.ReadThread;
import com.socket.socketChatroom.bio.thread.WriteThread;import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) {// 服务端地址,端口号String ip = "127.0.0.1";// 本机IP地址int port = 6666; // 必须和LoginServer的端口一样try {Socket client = new Socket(ip, port);Scanner scanner = new Scanner(System.in);System.out.println("请输入用户名");String username = scanner.nextLine();// 将用户名输出到LoginServerOutputStream outputStream = client.getOutputStream();PrintStream printStream = new PrintStream(outputStream);printStream.println(username);printStream.flush();// 接收LoginServer输出的是否登录成功标志("true"或"false")InputStream inputStream = client.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String state = bufferedReader.readLine();// 如果为"true",则为登录成功,可以开始聊天if (Boolean.parseBoolean(state)) {chat(username);}} catch (IOException e) {e.printStackTrace();}}public static void chat(String username) {try {String ip = "127.0.0.1";// 本机IP地址int port = 9999;// 必须和ChatServer的端口一样// 连接聊天服务器ChatServerSocket socket = new Socket(ip, port);// 将username输出到ChatServerOutputStream outputStream = socket.getOutputStream();PrintStream printStream = new PrintStream(outputStream);printStream.println(username);printStream.flush();// 因为聊天的收发消息不一定是与同一个人,所以创建两个线程分别用于收和发new ReadThread(socket).start();new WriteThread(socket).start();} catch (IOException e) {throw new RuntimeException(e);}}
}

5 创建服务器用于处理聊天的线程类ChatThread

import com.socket.socketChatroom.bio.server.ChatServer;import java.io.*;
import java.net.Socket;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;public class ChatThread extends Thread {private final String username;private final Socket socket;public ChatThread(String username, Socket socket) {this.username = username;this.socket = socket;}@Overridepublic void run() {while (true) {try {// 接收Client的WriteThread线程输出的消息InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String message = bufferedReader.readLine();System.out.println(username + "说: " + message);// 将当前所有在线的Client的username存入usernameSet中Map<String, Socket> socketMap = ChatServer.socketMap;Set<String> usernameSet = new HashSet<>();for (Map.Entry<String, Socket> map : socketMap.entrySet()) {usernameSet.add(map.getKey());}// 以"-"作为标识符,判断是群聊还是单聊String[] values = message.split("-");if (values.length == 2 && usernameSet.contains(values[0])) { //单聊// values[0]为要指定发送的Client的usernameOutputStream outputStream = socketMap.get(values[0]).getOutputStream();PrintStream printStream = new PrintStream(outputStream);// values[1]为消息内容printStream.println(username + "说: " + values[1]);printStream.flush();} else {//群聊// 将消息发送到除自己之外的所有Clientfor (String username : usernameSet) {if (socket != socketMap.get(username)) {OutputStream outputStream = socketMap.get(username).getOutputStream();PrintStream printStream = new PrintStream(outputStream);printStream.println(this.username + "说: " + message);printStream.flush();}}}} catch (IOException e) {throw new RuntimeException(e);}}}
}

6 创建客户端Client用于发送消息的线程类WriteThread

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;public class WriteThread extends Thread {private final Socket socket;public WriteThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {while (true) {try {// 获取输出流OutputStream outputStream = socket.getOutputStream();PrintStream printStream = new PrintStream(outputStream);// 键盘输入要发送的消息,若为单聊,则以要发送的Client的username+"-",开头,比如"111-hello",表示向111这个Client发送"hello"Scanner scanner = new Scanner(System.in);System.out.println("请输入聊天内容: ");String message = scanner.nextLine();// 输出消息到ChatServerprintStream.println(message);printStream.flush();} catch (IOException e) {throw new RuntimeException(e);}}}
}

7 创建客户端Client用于接收消息的线程类ReadThread

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;public class ReadThread extends Thread {private final Socket socket;public ReadThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {while (true) {try {// 从ChatServer获取消息InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String message = bufferedReader.readLine();System.out.println(message);} catch (IOException e) {throw new RuntimeException(e);}}}
}

项目结构如下图

8 测试

先运行LoginServer和ChatServer,再运行多个Client
设置IDEA允许运行多个实例

8.1 登录



8.2 群聊

8.2 单聊

Java Socket聊天室相关推荐

  1. java socket 聊天室_java利用Socket实现聊天室功能实例

    导读热词 最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人. 目录结构: ChatClient: package com.p ...

  2. java仿聊天室项目总结_Java团队课程设计-socket聊天室(个人总结)

    Java团队课程设计-socket聊天室(个人总结) 一.团队课程设计博客链接 二.本人负责模块或任务说明 任务1 服务端对socket线程的接受以及对客户端的数据转发操作 任务2 数据库的查找,添加 ...

  3. java仿聊天室项目总结_Java团队课程设计-socket聊天室(Day4总结篇)

    Java团队课程设计-socket聊天室(Day4总结篇) 团队名称: ChatRoom 项目git地址: git提交记录(仅截取部分): 面向对象设计包图.类图 包图 UML类图 总结: 首先总结一 ...

  4. JAVA版聊天室小软件

    这是一篇关于JAVA的聊天室室小软件,用的swing的技术同时也用到了socket.今天发布出来,希望能帮到大家. 文章目录 开发环境 项目结构 下载地址: 一.运行画面展示 二.代码部分 1.客户端 ...

  5. Java+Swing聊天室

    Java+Swing聊天室 一.系统介绍 二.系统展示 1.发送消息 2.清屏 三.系统实现 四.其他 1.其它系统 2.获取源码 一.系统介绍 本系统实现了简单的聊天室功能:发送消息.清屏.退出系统 ...

  6. java 嘻嘻哈哈聊天室

    服务端 package 夏日聊天室; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.I ...

  7. 2020暑假集训项目——Java简易聊天室

    经过一周的学习与搬砖,我成功的完成了暑假集训的第一个项目--Java简易聊天室,这里对整个项目做一个总结.(文末附下载地址) 本项目支持的功能: 1.可同时开启多个客户端进行多人聊天: 2.可与在线的 ...

  8. 基于java的聊天室系统设计与实现(项目报告+开题报告+答辩PPT+源代码+部署视频)

    项目报告 Java网络聊天室系统的设计与实现 计算机从出现到现在有了飞速的发展,现阶段的计算机已经不单单是用于进行运算的独立的个体了,跟随计算机一同发展的还有互联网技术,经过了长久的发展,互联网技术有 ...

  9. Java网络聊天室---个人博客

    Java网络聊天室 ---个人博客 一.项目简介 功能描述: 使用图形用户界面和socket通信,能实现一个聊天室中多人聊天,可以两人私聊,可以发送文件. 实现类似QQ用户注册.登录.聊天等功能. 参 ...

  10. 【计算机网络】Socket聊天室程序

    计算机网络第一次实验报告 实验名称:Socket聊天室程序 实验内容 使用流式Socket设计聊天协议,聊天信息带有时间标签和类型标签,本报告中将说明交互消息的类型.语法.语义.时序等具体的消息处理方 ...

最新文章

  1. 10元权限gm游戏_游戏P图超能打!揭秘10年老本儿500元升级计划
  2. Part 2 — Making Sense of Smart Contracts
  3. JS定时器小应用--设置闹铃
  4. asp.net mvc中的后台验证
  5. cocos2d-x 3.0 画图节点——Node
  6. webview的使用
  7. Qt OpenGL加载OBJ模型
  8. 微博有哪些营销价值?
  9. 除了 P站,原来还有A、C、D、E、G、H、K、M、N ... 站,全是老司机!
  10. Java爬去教务系统后怎么发布_java实现-强智教务系统API文档-课程信息
  11. C语言-初识C语言(4)
  12. java_servlet字符过滤器filter
  13. Linux系统下 修改服务器用户密码
  14. 多线程相关知识点总结
  15. 开放api接口签名验证
  16. 聊聊我的英语学习经验
  17. ECShop 后台订单列表美化
  18. 计算机综合板式制作步骤,板式家具的制作流程以及工具详解
  19. 飞翔的小鸟 c++ 2.0版
  20. hdu4348 为 心灵之旅To The Moon 出的 时光穿梭 题。主席树

热门文章

  1. mysql数据库重新命名
  2. 系统查看PSD缩略图
  3. python串口调试助手_python 串口调试工具源码
  4. python 获取像素颜色_python如何读取像素值
  5. 2021双非考研408上岸南京大学计算机经验帖
  6. HTML5响应式手机模板:H5网站设计——政府街道社区wap微信官网模板(11个页面) HTML+CSS+JavaScript 手机模板wap 手机网站模板 企业手机网站模板
  7. Android11安装谷歌,Android 11正式版
  8. java计算机毕业设计教务排课系统(附源码、数据库)
  9. 极化码理论及算法研究3-Arikan原版论文学习总结
  10. 微信公众号后台接口文档