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多人聊天室第一版的更多相关文章

  1. 多人聊天室(Java)

    第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...

  2. java socket之多人聊天室Demo

    一.功能介绍 该功能实现了一个类似QQ的最简单多人聊天室,如下图所示. 二.目录结构 三.服务端 1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程: pa ...

  3. java小程序---简陋版多人聊天室

    功能需求: 1 每运行一次主函数,创建一个客户端聊天界面; 2 客户端界面分三块,公屏(显示所有客户端发送的信息),私屏(用于输入个人想要发送的信息),发送按钮(点击一次,将客户端信息发送到服务端) ...

  4. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...

  5. Spring整合DWR comet 实现无刷新 多人聊天室

    用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无刷新,一般会使用到Ajax.Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔 ...

  6. 66 网络编程(五)——TCP多线程实现多人聊天室

    思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...

  7. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  8. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  9. 使用Go语言+Protobuf协议完成一个多人聊天室

    软件环境:Goland Github地址 一.目的 之前用纯逻辑垒完了一个可登入登出的在线多人聊天室(代码仓库地址),这次学习了Protobuf协议,于是想试着更新下聊天室的版本. 主要目的是为了掌握 ...

随机推荐

  1. LeetCode1046 最后一块石头的重量(贪心—Java优先队列简单应用)

    题目: 有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出两块最重的石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == ...

  2. 抓取屏幕并压缩生成HBITMAP

    HBITMAP GetScreenBmp() { HWND hwnd = ::GetDesktopWindow(); HDC hsrc = ::GetDC(hwnd); HDC hmemdc = :: ...

  3. Loadrunner11的关联问题 《转载》

    Loadrunner11的关联问题 链接:http://www.51testing.com/html/15/523415-821644.html

  4. word中替换内容

    参考了一篇文章 然后做了如下修改  用python的win32com模块替换word中的文字搞定批量打印奖状 python 操作 office python操作word # -*- coding: u ...

  5. Spring-IOC(基于注解)

    1.Spring 的 Bean 管理:(注解方式) 1.1 创建 web 项目,引入 Spring 的开发包: 注:在 Spring 的注解的 AOP 中需要引入 spring-aop 的 jar 包 ...

  6. 096-PHP循环使用next取数组元素

    <?php function return_item($arr,$num=0){ //定义函数 for($i=0;$i<$num;$i++){ //循环向前移动数组指针 next($arr ...

  7. ES6 之 Reflect 的方法总结

    1. 概述 将 Object 对象的一些明显属于语言内部的方法(比如 Object.defineProperty ),放到 Reflect 对象上. 修改某些 Object 方法的返回结果,让其变得更 ...

  8. Node.js NPM Package.json

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json Nod ...

  9. redis十-对快照模式分析

    复制自:http://www.cnblogs.com/huangxincheng/p/5010795.html 一:快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是 ...

  10. C++的随机数

    C++产生随机数 C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand(). 不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是 ...