在之前的基础上实现了群聊 可以设置多个客户端
客户端
//服务端可以不断的发送信息给客户端 也可以不断的接受客户端的信息
//多个客户端 一个服务器
public class Client051 {
static Scanner sc = new Scanner(System.in);
static Socket socket;
public static void main(String[] args) {
//创建客户端套接字 用户交互服务器
try {
socket = new Socket("127.0.0.1", 8005);
System.out.println("客户端1开启");
//根据套接字获取输出流 把信息从内存拿出来就是输出 写进内存就是输入
new Thread(()->{
while (true) {
try {
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
String s = null;
s = dataInputStream.readUTF();
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取服务端发过来的消息
}).start();
while (true) {
OutputStream outputStream = socket.getOutputStream();
//将字节输出流包装成数据字节输出
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.flush();
//这行代码的确定缺点 程序会阻塞在这里等待输入
dataOutputStream.writeUTF("客户端1说:"+sc.next());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器
//服务端可以不断的发送信息给客户端 也可以不断的接受客户端的信息
//多个客户端 一个服务器
public class Server05 {
//定义集合用来存放每一个客户端socket
private static List<Socket> socketList = new ArrayList<>();
static Scanner sc = new Scanner(System.in);
static ServerSocket serverSocket;
static Socket socket;
public static void main(String[] args) {
try {
//创建服务端套接字ServerSocket 并指定端口号
serverSocket = new ServerSocket(8005);
System.out.println("-------------------服务器开启-------------------");
//主线程用来不停的监听客户端 把客户端放进集合保存起来
while (true) {
try {
socket = serverSocket.accept();//因为我们要监听多个客户端 所以要将它放在循环里面 当客户端端建立连接后继续往下运行
socketList.add(socket);//有人连接到服务器 就将它的socket保存到list集合里面去
System.out.println("当前在线人数为:"+socketList.size());//用来记录与服务器连接的客户端数量
//创建一个新的线程不停的获取数据然后发送给每一个客户端
new Thread(()->{
boolean flag = false;
Socket mySelf = null;
while (true) {
try {
if(!flag) {
mySelf = socket;//保证当前线程只拿到一个socket
flag = true;
}
DataInputStream dataInputStream = new DataInputStream(mySelf.getInputStream());
String s = dataInputStream.readUTF();
for (Socket socketTemp : socketList) {
if(mySelf == socketTemp) {
continue;
}
DataOutputStream dataOutputStream = new DataOutputStream(socketTemp.getOutputStream());
dataOutputStream.writeUTF(s);
dataOutputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}