Server端
package com.chat;
import jdk.jfr.internal.tool.Main;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
public static ArrayList<Socket> sockets = new ArrayList<Socket>();
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(3333);
while (true)
{
Socket accept = ss.accept();
sockets.add(accept);
new ServerFun(accept).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
由于我们要实现群体转发,所以一定要有一个集合来存储所有的客户端。每次监听到一个新的请求套接字,就添加到集合中。
线程实现
package com.chat;
import java.io.*;
import java.net.Socket;
public class ServerFun extends Thread{
private Socket socket;
public ServerFun(Socket socket)
{
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg;
while ((msg = br.readLine())!=null)
{
sendMsgToAll(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendMsgToAll(String msg) {
for (Socket socket:
Server.sockets) {
try {
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我们每次接收到消息之后,就遍历所有的socket,并向每个socket进行写操作
监听客户端
package com.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ListenClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",3333);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
byte[] bytes = new byte[1024];
String msg;
while ((msg = br.readLine())!=null)
{
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
发送客户端
package com.design;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 3333);
OutputStream outputStream = socket.getOutputStream();
PrintStream ps = new PrintStream(outputStream);
Scanner sc = new Scanner(System.in);
String msg;
while ((msg = sc.nextLine())!=null)
{
ps.println(msg);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}