Java 简单模拟聊天功能的群聊
废话不多说直接上代码吧
首先是服务器端
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//聊天功能的服务器类
public class Server {
public static List<BufferedWriter> list = new ArrayList();
public static void start() throws Exception {
// 定义服务器应用的端口号
ServerSocket ssocket = new ServerSocket(9000);
System.out.println("服务器开启。。。");
while(true) {
// 等待接收客户端连接进来
Socket client = ssocket.accept();
// 为了能接收多个客户端可以链接进来,因此需分别为每个客户端启动一条线程进行处理
new Thread() {
public void run() {
try {
System.out.println("有客户进来了》》》》");
// 获取读取客户端数据的流对象
BufferedReader br =new BufferedReader(new InputStreamReader(client.getInputStream()));
// 获取往客户端写数据的流对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
// 把每个客户端的写数据的流对象保存到list 列表中,相当于加入到同一个聊天室
list.add(bw);
String data = null;
// 读取客户端发送过来的信息
while((data = br.readLine()) != null) {
// 循环写出到聊天室内的每个客户端
Iterator<BufferedWriter> iterator = list.iterator();
while(iterator.hasNext()) {
BufferedWriter bw1 =iterator.next();
try {
bw1.write(data);
bw1.newLine();
bw1.flush();
} catch (Exception e) {
// 如果有客户端中途退出聊天室,则删除该客户端的流对象
iterator.remove();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
public static void main(String[] args) throws Exception{
Server.start();
}
}
然后是客户端
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
//聊天功能的客户端类
public class ClientSide {
public static void start() throws Exception {
//定义客户端的ip
String ip = "127.0.0.1";
// 定义要链接的服务器的端口号
int port = 9000;
//创建网络连接对象
Socket socket = new Socket(ip, port);
/**
* 发送消息
*/
new Thread() {
public void run() {
try {
// 获取往服务去写数据的流对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 监听键盘输入的流对象
BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));
String data = null;
// 读取键盘输入的信息,并写出到服务去
while ((data = keyIn.readLine()) != null) {
System.out.println(data);
bw.write(data);
bw.newLine();
bw.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
/**
* 接收消息
*/
new Thread() {
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String data1 = null;
while ((data1 = br.readLine()) != null) {
System.out.println("服务器回复:"+data1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
public static void main(String[] args) throws Exception {
ClientSide.start();
}
}
启动服务器后,在启动客户端(同时启动多个客户端),客户端之间就可以相互发消息了。
这是基本模拟群聊功能,还有很多可以改善和优化的地方,欢迎大家指正和评论。