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协议,于是想试着更新下聊天室的版本. 主要目的是为了掌握 ...
随机推荐
- 解析基于keras深度学习框架下yolov3的算法
一.前言 由于前一段时间以及实现了基于keras深度学习框架下yolov3的算法,本来想趁着余热将自己的心得体会进行总结,但由于前几天有点事就没有完成计划,现在趁午休时间整理一下. 二.Keras框架 ...
- 访问eureka 显示xml
两种解决方式: 方式一:(我是通过此方式解决的) 一个博客“http://blog.csdn.net/l5764773160/article/details/77483730”,他的解决方案是: 将项 ...
- 将visual sdudio+Qt5.12 制作的程序打包成单个exe
在GitHub上下载了个qt程序,由于C++不太会,经过安装qt.修改编码等一系列操作终于可以运行了. 生成的exe在运行时依赖很多dll或者图片文件,直接拷贝到其他电脑上无法运行,可以将依赖的dll ...
- python面试题整理(二)
1.进程,线程,协程定义,有什么区别 进程是操作系统分配资源的最小单位,一个进程对应一块CPU 线程是进程中的某一个控制单元,是CPU调度的最小单元,线程之间相互独立,进程结束线程也会结束,一个进程至 ...
- Windows平台整合SpringBoot+KAFKA__第2部分_代码编写前传
开始准备写测试代码 看半天不太懂(我也算是小白级别的,看我搞windows版本的kafka就知道了), 看文档无聊,偶然看到一个KAFKA的windows管理程序,于是就试试就装了一个,感觉那个玩意也 ...
- 十八、SAP中使用IF/ELSE判断语句,以及sy-subrc的用法
一.sy_subrc为上一条语句的执行结果,如果为0,则表示执行成功. 需要注意的是,IF ELSE语句,每一个关键字都需要带句号 二.执行效果如下 相关代码如下 *&------------ ...
- 064-PHP函数中局部变量在函数外不可使用
<?php function print_num(){ //定义函数 $x=6; //在函数中定义变量 } print_num(); //调用函数 echo $x; ?>
- Power BI Desktop 安装环境
Power BI Desktop 环境 最低要求 Windows 7/Windows Server 2008 R2 或更高版本 .NET 4.5 Internet Explorer 9 或更高版本 内 ...
- 我学到的treap
到目前为止,平衡树应该是我学过的数据结构里面最难的一个了.(顺便贴上一个我认为treap讲解的比较好的博客https://blog.csdn.net/u014634338/article/detail ...
- css ~ a标签占满父级元素
width: 100%; height: 100%; display: block;