服务端
/*
* 聊天室服务端
*/
public class Chat_Server {
// 在线客户端
static ArrayList<Socket> online = new ArrayList<>();
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
// 启动服务器,绑定端口
serverSocket = new ServerSocket(8989);
// 接收多个客户端同时连接
while (true) {
Socket socket = serverSocket.accept();
online.add(socket); // 把新连接的客户端添加到online列表中
MessageHandler mh = new MessageHandler(socket, online);
mh.start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
MessageHandler.java
/*
* 获取当前socket中的数据,并发送给聊天室所有人员
*/
public class MessageHandler extends Thread {
private Socket socket;
private String ip;
private ArrayList<Socket> online;
public MessageHandler(Socket socket, ArrayList<Socket> online) {
this.socket = socket;
this.online = online;
}
@Override
public void run() {
try {
ip = socket.getInetAddress().getHostAddress();
// 给其他客户端发送当前socket客户端上线了
sendToOther(ip + "上线了");
// 接收客户端消息
InputStream inputStream = socket.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader br = new BufferedReader(reader);
String str;
while ((str = br.readLine()) != null) {
sendToOther(ip + ":" + str);
}
sendToOther(ip + "下线了");
} catch (IOException e) {
e.printStackTrace();
}
}
// 给所有客户端发送消息
private void sendToOther(String message) throws IOException {
for (Socket on : online) {
OutputStream every = on.getOutputStream();
PrintStream ps = new PrintStream(every);
ps.println(message);
}
}
}
客户端
/*
* 聊天室客户端
*/
public class Chat_Client {
public static void main(String[] args) {
try {
// 1. 连接服务器
Socket socket = new Socket("127.0.0.1", 8989);
// 2. 开启两个线程
// 一个线程负责接收服务器转发的消息
Receive receive = new Receive(socket);
receive.start();
// 一个线程负责发送自己的消息
Send send = new Send(socket);
send.start();
send.join(); // 等待发送结束后,才结束整个程序
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Receive.java
/*
* 接收
*/
public class Receive extends Thread {
private Socket socket;
public Receive(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();
Scanner input = new Scanner(inputStream);
while (input.hasNextLine()) {
String line = input.nextLine();
System.out.println(line);
}
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Send.java
/*
* 发送
*/
public class Send extends Thread {
private Socket socket;
public Send(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
Scanner input = new Scanner(System.in);
OutputStream outputStream = socket.getOutputStream();
// 按行打印
PrintStream ps = new PrintStream(outputStream);
while (true) {
System.out.print("发送:");
String str = input.nextLine();
if ("bye".equals(str)) {
break;
}
ps.println(str);
}
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}