Java多人聊天室第一版
时间:2019-08-21
本文章向大家介绍Java多人聊天室第一版,主要包括Java多人聊天室第一版使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 package cn.zhang.chat; 2 3 import java.io.BufferedReader; 4 import java.io.PrintWriter; 5 6 /** 7 * 所有用户均有的信息,单独设为一个类 8 * @author 9 * 10 */ 11 12 public class Account { 13 14 //封装,属性设为私有 15 private String name; 16 private BufferedReader reader; 17 private PrintWriter writer; 18 19 //设置相应的set和get方法 20 public String getName() { 21 return name; 22 } 23 24 public void setName(String name) { 25 this.name = name; 26 } 27 28 public BufferedReader getReader() { 29 return reader; 30 } 31 32 public void setReader(BufferedReader reader) { 33 this.reader = reader; 34 } 35 36 public PrintWriter getWriter() { 37 return writer; 38 } 39 40 public void setWriter(PrintWriter writer) { 41 this.writer = writer; 42 } 43 }
1 package cn.zhang.chat; 2 3 import java.io.*; 4 import java.net.Socket; 5 import java.util.Scanner; 6 7 public class ChatClient { 8 9 public static void main(String[] args) throws Exception { 10 Scanner sc = new Scanner(System.in); 11 12 while (true) { 13 System.out.print("请输入昵称:"); 14 String name = sc.nextLine(); 15 16 Socket s = new Socket(UserData.HOST, UserData.PORT); 17 InputStream in = s.getInputStream(); 18 OutputStream out = s.getOutputStream(); 19 20 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 21 PrintWriter writer = new PrintWriter(new OutputStreamWriter(out), true); 22 23 writer.println(name); 24 String temp = reader.readLine(); 25 if (temp.equals("success")) { 26 // 启动新线程监听消息 27 Account user = new Account(); 28 user.setReader(reader); 29 user.setWriter(writer); 30 user.setName(name); 31 ReceiveMessage rm = new ReceiveMessage(user); 32 new Thread(rm).start(); 33 34 // 给服务器发消息 35 while (true) { 36 37 String msg = sc.nextLine(); 38 writer.println(msg); 39 40 } 41 42 } else { 43 44 System.out.println(temp); 45 46 } 47 } 48 } 49 }
1 package cn.zhang.chat; 2 3 import java.io.*; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 /** 7 * 服务器端的ChatServer 8 * @author 9 * 10 */ 11 public class ChatServer { 12 13 public static void main(String[] args) throws Exception { 14 15 //等待用户连接之前,创建一个SeverSocket 16 ServerSocket ss = new ServerSocket(UserData.PORT); 17 18 while (true) { 19 System.out.println("等待链接"); 20 Socket s = ss.accept(); 21 22 InputStream in = s.getInputStream(); 23 OutputStream out = s.getOutputStream(); 24 25 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 26 PrintWriter writer = new PrintWriter(new OutputStreamWriter(out), true); 27 28 String name = reader.readLine();//读入名字 29 30 boolean flag = false; 31 32 //foreach循环遍历名字,若名字相同,则返回用户名已存在 33 for (Account a : UserData.USERS) { 34 if (a.getName().equals(name)) { 35 flag = true; 36 } 37 } 38 if (flag) { 39 writer.println("用户名已存在~~~"); 40 } else { 41 writer.println("success"); 42 } 43 44 // 启动一个新的线程监听消息 45 Account user = new Account(); 46 user.setName(name); 47 user.setWriter(writer); 48 user.setReader(reader); 49 50 SendMessage sm = new SendMessage(user); 51 new Thread(sm).start(); 52 53 UserData.USERS.add(user); 54 for (Account a : UserData.USERS) { 55 a.getWriter().println("[" + name + "]进入聊天室,当前在线人数:" + UserData.USERS.size()); 56 } 57 } 58 59 } 60 61 }
1 package cn.zhang.chat; 2 3 public class ReceiveMessage implements Runnable { 4 5 private Account user; 6 7 public ReceiveMessage(Account user) { 8 this.user = user; 9 } 10 11 @Override 12 public void run() { 13 while (true) { 14 try { 15 String msg = this.user.getReader().readLine(); 16 System.out.println(msg); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 } 21 } 22 }
1 package cn.zhang.chat; 2 3 4 import java.io.IOException; 5 6 public class SendMessage implements Runnable { 7 8 private Account user; 9 10 public SendMessage(Account user) { 11 this.user = user; 12 } 13 14 //重写父类方法 15 @Override 16 public void run() { 17 while (true) { 18 try { 19 String msg = this.user.getReader().readLine(); 20 for (Account a : UserData.USERS) { 21 if (!a.getName().equals(this.user.getName())) { 22 a.getWriter().println(this.user.getName() + " 说:" + msg); 23 } 24 } 25 26 } catch (Exception e) { 27 UserData.USERS.remove(this.user); 28 for (Account a : UserData.USERS) { 29 System.out.println("[" + this.user.getName() + "]退出了聊天室,当前在线人数:" + UserData.USERS.size()); 30 a.getWriter().println("[" + this.user.getName() + "]退出了聊天室,当前在线人数:" + UserData.USERS.size()); 31 break; 32 } 33 34 e.printStackTrace(); 35 } 36 } 37 } 38 }
1 package cn.zhang.chat; 2 import java.util.ArrayList; 3 import java.util.List; 4 /** 5 * 用户基本信息 6 * @author 7 * 8 */ 9 public class UserData { 10 11 public static final String HOST = "127.0.0.1"; 12 public static final int PORT = 8888; 13 14 public static final List<Account> USERS = new ArrayList<>(); 15 16 }
原文地址:https://www.cnblogs.com/zhangqiling/p/11389355.html
- 从python2到python3
- 【干货】如何写代码 -编程内功心法
- .NET中的异步编程下
- 深度学习数学基础一--最小二乘法
- 【LeetCode 344】关关的刷题日记26 Reverse String
- 基于AOE网的关键路径的求解
- 【LeetCode 122】关关刷题日记25-Best Time to Buy and Sell Stock II
- 【干货】python正则表达式应用笔记
- .NET跨平台之旅:将示例站点从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0
- .NET跨平台之旅:在Linux上以本地机器码(native)运行ASP.NET Core站点
- 【干货】基于pytorch的CNN、LSTM神经网络模型调参小结
- jenkins配置.net mvc网站
- 简述【聚类算法】
- word2vec理论与实践
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释