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协议,于是想试着更新下聊天室的版本. 主要目的是为了掌握 ...
随机推荐
- python-处理json、处理时间
1.处理json:import json #json串就是字符串. d = { 'car1':{'color':'red','price':100,'count':50}, 'car2':{'colo ...
- jdbc oracle 连接串
jdbc.url配置为: jdbc:oracle:thin:@xxx.xx.xx.xx:1521:orclpdb 报错: java.sql.SQLException: Listenerrefused ...
- C# 关于AD域的操作 (首博)
前段时间(因为懒得找具体的时间了)公司说让系统可以进行对AD域的操作,包括创建用户.于是上网查资料,了解何为AD域.还不知道的这边请https://www.cnblogs.com/cnjavahome ...
- 51nod 1206:Picture 求覆盖周长
1206 Picture 题目来源: IOI 1998 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 给出平面上的N个矩形(矩形的边平行于X轴和 ...
- cf 398B. Painting The Wall
23333,还是不会..%%%http://hzwer.com/6276.html #include <bits/stdc++.h> #define LL long long #defin ...
- 018-PHP判断文件是否存在
<?php print("data.txt文件是否存在?" . "<br>"); if (file_exists("data.txt ...
- VUE- Cordova打包APP
VUE- Cordova打包APP 现在使用vue开发的项目越来越多,使用vue开发的移动端打包就成了最大的问题.现在前端打包方案有好多种,但是综合来说,我比较喜欢用cordova来进行Android ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 预处理器
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理. 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前.预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾 ...
- Node.js NPM 教程
NPM是Node.js的包(或模块)管理器,是Node.js应用程序开发的核心. www.npmjs.com上有海量的Node.js包,供免费下载使用. 当安装Node.js时,NPM程序会被同时安装 ...
- UVA - 12563 Jin Ge Jin Qu hao(劲歌金曲)(0-1背包+滚动数组)
题意:在KTV唱歌剩下的t秒时间内,决定选最爱的n首歌中的一部分歌,在时间结束之前唱一首时长678秒的<劲歌金曲>,使得唱的总曲目尽量多(包括<劲歌金曲>),在此前提下尽量晚的 ...