java 聊天室
服务端
public class ChatRoomServer {
/**
* 创建一个ArrayList对象 来保存聊天室成员
*/
static List<Socket> socketList = new ArrayList<>();
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket serverSocket = new ServerSocket(9999);
/**
* 单独的一个线程 用来实现消息的群发
*/
new Thread(new SendMsgThread(socketList)).start();
System.out.println("等待客户端启动中......");
while (true) {
/**
* 等待客户端的连接 如果没有连接 线程会一直等待客户端的连接
*/
Socket socket = serverSocket.accept();
/**
* 将连接的客户端( socket )存入集合( socketList )
*/
socketList.add(socket);
// System.out.println(socket.getInetAddress() + "上线了....");
/**
* 为每一个上线的新成员 单独的开设一个 线程
*/
new Thread(new ReadMsgThread(socket)).start();
}
}
static class ReadMsgThread implements Runnable {
private Socket socket;
public ReadMsgThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
boolean flag=true;
while (true) {
/**
* 获取输入流 读取消息
* 接收成员发送的消息
*/
InputStream in = socket.getInputStream();
byte[] bytes = new byte[1024];
int read = in.read(bytes);
// xxx&你好
String mag=new String(bytes,0,read);
// 解析 正则表达式 按照 & 分割
String[] spilt=mag.split("&");
/**
* 昵称 spilt 数组的第一个 为昵称
*/
String nickName= spilt[0];
/**
* 要发送的内容 spilt 数组的第一个 为要发送的内容
*/
String content=spilt[1];
if(flag){
System.out.println(nickName+"上线了.............");
flag=false;
}
System.out.println(nickName+"说:"+content);
}
} catch (Exception e) {
}
}
}
/**
* 消息群发的线程
*/
static class SendMsgThread implements Runnable {
private List<Socket> socketList;
public SendMsgThread(List<Socket> socketList) {
this.socketList = socketList;
}
@Override
public void run() {
try {
/**
* 输出流 服务端用来向客户端发送消息
*/
Scanner scan=new Scanner(System.in);
while (true){
System.out.println("请输入你要发的内容:");
String msg= scan.next();
/**
* 遍历 socketList 获取集合中的每一个socket
*/
for (Socket socket:socketList) {
OutputStream out = socket.getOutputStream();
out.write(msg.getBytes());
}
}
} catch (Exception e) {
}
}
}
}
客户端1
public class ChatClient01 {
private static final long serialVersionUID = -4639126076052875403L;
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 9999);
/**
* 启动接收 服务端 向客户端群发的信息
*/
new Thread(new ReadServerMsg(socket)).start();
Scanner scan=new Scanner(System.in);
System.out.println("请设置你的昵称: ");
String nickName=scan.next();
while (true){
OutputStream out=socket.getOutputStream();
System.out.println("请输入你要发送的内容:");
String content=scan.next();
/**
* 打包所有的信息 昵称 发送的消息 使用'&'连接
* eg: 张三&你好
*/
String msg=nickName+"&"+content;
out.write(msg.getBytes());
}
}
static class ReadServerMsg implements Runnable{
private Socket socket;
public ReadServerMsg(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
while (true){
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int read=in.read(bytes);
String msg=new String(bytes,0,read);
System.out.println("Server:"+msg);
}
}catch (Exception e){
}
}
}
}
客户端2
public class ChatClient02 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 9999);
/**
* 启动接收 服务端 群发消息的线程
*/
new Thread(new ReadServerMsg(socket)).start();
Scanner scan=new Scanner(System.in);
System.out.println("请设置你的昵称:");
String nickName= scan.next();
while (true){
OutputStream out=socket.getOutputStream();
System.out.println("请输入你要发送的内容:");
String content=scan.next();
/**
* 打包所有的信息 昵称 发送的消息 使用'&'连接
* eg: 张三&你好
*/
String msg=nickName+content;
out.write(msg.getBytes());
}
}
static class ReadServerMsg implements Runnable{
private Socket socket;
public ReadServerMsg(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
while (true){
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int read=in.read(bytes);
String msg=new String(bytes,0,read);
System.out.println("Server:"+msg);
}
}catch (Exception e){
}
}
}
}