Java多人聊天室第一版
package cn.zhang.chat; import java.io.BufferedReader;
import java.io.PrintWriter; /**
* 所有用户均有的信息,单独设为一个类
* @author
*
*/ public class Account { //封装,属性设为私有
private String name;
private BufferedReader reader;
private PrintWriter writer; //设置相应的set和get方法
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public BufferedReader getReader() {
return reader;
} public void setReader(BufferedReader reader) {
this.reader = reader;
} public PrintWriter getWriter() {
return writer;
} public void setWriter(PrintWriter writer) {
this.writer = writer;
}
}
package cn.zhang.chat; import java.io.*;
import java.net.Socket;
import java.util.Scanner; public class ChatClient { public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in); while (true) {
System.out.print("请输入昵称:");
String name = sc.nextLine(); Socket s = new Socket(UserData.HOST, UserData.PORT);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in));
PrintWriter writer = new PrintWriter(new OutputStreamWriter(out), true); writer.println(name);
String temp = reader.readLine();
if (temp.equals("success")) {
// 启动新线程监听消息
Account user = new Account();
user.setReader(reader);
user.setWriter(writer);
user.setName(name);
ReceiveMessage rm = new ReceiveMessage(user);
new Thread(rm).start(); // 给服务器发消息
while (true) { String msg = sc.nextLine();
writer.println(msg); } } else { System.out.println(temp); }
}
}
}
package cn.zhang.chat; import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器端的ChatServer
* @author
*
*/
public class ChatServer { public static void main(String[] args) throws Exception { //等待用户连接之前,创建一个SeverSocket
ServerSocket ss = new ServerSocket(UserData.PORT); while (true) {
System.out.println("等待链接");
Socket s = ss.accept(); InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in));
PrintWriter writer = new PrintWriter(new OutputStreamWriter(out), true); String name = reader.readLine();//读入名字 boolean flag = false; //foreach循环遍历名字,若名字相同,则返回用户名已存在
for (Account a : UserData.USERS) {
if (a.getName().equals(name)) {
flag = true;
}
}
if (flag) {
writer.println("用户名已存在~~~");
} else {
writer.println("success");
} // 启动一个新的线程监听消息
Account user = new Account();
user.setName(name);
user.setWriter(writer);
user.setReader(reader); SendMessage sm = new SendMessage(user);
new Thread(sm).start(); UserData.USERS.add(user);
for (Account a : UserData.USERS) {
a.getWriter().println("[" + name + "]进入聊天室,当前在线人数:" + UserData.USERS.size());
}
} } }
package cn.zhang.chat;
public class ReceiveMessage implements Runnable {
private Account user;
public ReceiveMessage(Account user) {
this.user = user;
}
@Override
public void run() {
while (true) {
try {
String msg = this.user.getReader().readLine();
System.out.println(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package cn.zhang.chat;
import java.io.IOException;
public class SendMessage implements Runnable {
private Account user;
public SendMessage(Account user) {
this.user = user;
}
//重写父类方法
@Override
public void run() {
while (true) {
try {
String msg = this.user.getReader().readLine();
for (Account a : UserData.USERS) {
if (!a.getName().equals(this.user.getName())) {
a.getWriter().println(this.user.getName() + " 说:" + msg);
}
}
} catch (Exception e) {
UserData.USERS.remove(this.user);
for (Account a : UserData.USERS) {
System.out.println("[" + this.user.getName() + "]退出了聊天室,当前在线人数:" + UserData.USERS.size());
a.getWriter().println("[" + this.user.getName() + "]退出了聊天室,当前在线人数:" + UserData.USERS.size());
break;
}
e.printStackTrace();
}
}
}
}
package cn.zhang.chat;
import java.util.ArrayList;
import java.util.List;
/**
* 用户基本信息
* @author
*
*/
public class UserData { public static final String HOST = "127.0.0.1";
public static final int PORT = 8888; public static final List<Account> USERS = new ArrayList<>(); }
Java多人聊天室第一版的更多相关文章
- 多人聊天室(Java)
第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...
- java socket之多人聊天室Demo
一.功能介绍 该功能实现了一个类似QQ的最简单多人聊天室,如下图所示. 二.目录结构 三.服务端 1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程: pa ...
- java小程序---简陋版多人聊天室
功能需求: 1 每运行一次主函数,创建一个客户端聊天界面; 2 客户端界面分三块,公屏(显示所有客户端发送的信息),私屏(用于输入个人想要发送的信息),发送按钮(点击一次,将客户端信息发送到服务端) ...
- Apache MiNa 实现多人聊天室
Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...
- Spring整合DWR comet 实现无刷新 多人聊天室
用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无刷新,一般会使用到Ajax.Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔 ...
- 66 网络编程(五)——TCP多线程实现多人聊天室
思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 使用Go语言+Protobuf协议完成一个多人聊天室
软件环境:Goland Github地址 一.目的 之前用纯逻辑垒完了一个可登入登出的在线多人聊天室(代码仓库地址),这次学习了Protobuf协议,于是想试着更新下聊天室的版本. 主要目的是为了掌握 ...
随机推荐
- 吴裕雄--天生自然java开发常用类库学习笔记:一对多关系范例
import java.util.List ; import java.util.ArrayList ; public class School{ private String name ; priv ...
- NIFI
Apache nifi 第一篇(概述) Apache nifi 第二篇(小白初试) nifi数据对接流程初次尝试 NIFI ExecuteSQL配置教程(1.8) Processor(处理器)之配置 ...
- Charles抓包(HTTP)
一.电脑抓包: 安装Charles,打开Charles即可 二.手机抓包: 设置手机WiFi配置代理即可:(确保电脑和手机在同一个网络) 三.拦截请求: 四.修改请求/返回: 打上断点后,刷新页面,在 ...
- vue-cli 局域网可访问配置
vue-cli 使用官方脚手架搭建以后,本地的config配置已经没有了,默认打开localhost,无法ip访问 只要修改项目目录配置和防火墙配置 1.在项目根目录下面加一个文件vue.config ...
- edge浏览器两个标签页localStorage不同步,解决办法
今天遇到个奇怪的问题,edge两个标签页之间的localStorage值不同步,网上说ie和edge如果想让localStorage值同步,需要主动出发localStorage的change事件 wi ...
- 记一次Win上MySQL乱码问题
Win上MySQL乱码问题 笔记本上的数据库总会时不时的乱码(或者是一直乱码我没注意到?),在谷歌上试了几次错才正确解决,在此记录一下. 在MySQL数据库存储目录找到my.ini,在相应的标签下分别 ...
- Centos 时间与主机时间不匹配问题解决
有时候新安装的虚拟机的系统时间会和主机的时间差8个小时,这是因为虚拟机和主机所在的时区不同. 这会导致当你往mysql数据库插入数据时如果设置时间为current_time结果会和虚拟机保持一致. 1 ...
- 实验吧-密码学-变异凯撒(ascii码规律运算)
密文是:afZ_r9VYfScOeO_UL^RWUc 刚开始很迷,不知道往什么方向,到最后才发现,原来和ASCII有关. 将flag{的ASCII码和密文的ASCII码对比: 97 102 90 95 ...
- mysql第六篇 : MySQL索引原理与慢查询优化
浏览目录 一.索引介绍 二.索引方法 三.索引类型 四.聚合索引和辅助索引 五.测试索引 六.正确使用索引 七.组合索引 八.注意事项 九.查询计划 十.慢日志查询 十一.大数据量分页优化 一.索引介 ...
- ORACLE时间相关问题
一.遇到一个情况数据库存入的时间格式为20180831154546,需要将其转化为日期时分秒格式的. to_date('20180831154546', 'yyyy-mm-dd hh24:mi:ss' ...