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协议,于是想试着更新下聊天室的版本. 主要目的是为了掌握 ...
随机推荐
- mpvue + Vant weapp + 微信云服务 打造小程序应用
写在前面的话: 从事小程序开发已经大半年的时间了,但是一直都是再用原生写项目.一直想着用框架自己写一个小程序,但苦于一直没有时间.正好最近项目搁置,有了空闲时间,就研究了下mpvue + Vant w ...
- MongoDB_02简介
MongoDB简介 MongoDB是一个开源,高性能,无模式的文档型数据库. 它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以他既可以存储比较复杂的数据类型,又相当的灵活. Mon ...
- 2020/2/22 74cms3.5.1 代码审计
0x00 网站结构 简单试了一下.每一个模块还是比较清楚的,分别对应网站的一个模块.还有一些没有权限访问 0x01 通读代码 先看入口文件,index.php 开头先对网站是否安装做了判断 然后就是判 ...
- C/C++贪心算法解决TSP问题
贪心算法解决旅行商问题 TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述如下: 有若干 ...
- Redis 详解 (二) redis的配置文件介绍
目录 1.开头说明 2.INCLUDES 3.MODULES 4.NETWORK 5.GENERAL 6.SNAPSHOTTING 7.REPLICATION 8.SECURITY 9.CLIENTS ...
- 11.swoole学习笔记--进程信号触发器
<?php //触发函数--异步执行 swoole_process::signal(SIGALRM,function(){ ; echo "$i \n"; $i++; ){ ...
- 056-for循环中continue的使用
<?php ; $i <= ; $i++) { //for循环输出数值 == ) //判断变量是否为3的整数倍 { continue;//跳过本次循环剩余语句 } echo "$ ...
- SQL Server 语法大全
SQL语句参考,包含Access.MySQL 以及 SQL Server 基础 创建数据库 CREATE DATABASE database-name 删除数据库 drop database dbna ...
- cudaThreadSynchronize()
// 调用CUDA kernel 是非阻塞的,调用kernel语句后面的语句不等待kernel执行完,立即执行.所以在 call_kernel(see kernel.cu) 中执行 m5op.dump ...
- UVA - 10886 Standard Deviation (标准差)(数论)
题意:下面是一个随机数发生器.输入seed的初始值,你的任务是求出它得到的前n个随机数标准差,保留小数点后5位(1<=n<=10000000,0<=seed<264). 分析: ...