我正在使用套接字制作一个终端聊天应用程序。对于此应用程序,我有两个文件:Server.java和Client.java。该程序是这样工作的。
问题
现在,我在向所有客户端发送消息时遇到问题。目前,邮件仅发送给提交邮件的客户端。
实施
我正在通过将所有客户端放入一个数组列表中来鼓励该功能向所有客户端发送消息。 客户端提交消息后,我有一个for循环,该循环遍历客户端的arraylist并将消息发送给所有客户端。此功能在sendAll方法中实现。
Server.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.*;
import java.io.*;
import java.util.*;
public class Server {
public static ArrayList<ClientHandler> clients = new ArrayList<ClientHandler>();
public static void main(String[] args) {
ServerSocket server = null;
try {
server = new ServerSocket(32000);
server.setReuseAddress(true);
// The main thread is just accepting new connections
while (true) {
Socket client = server.accept();
System.out.println("New client connected " + client.getInetAddress().getHostAddress());
ClientHandler clientSock = new ClientHandler(client);
// The background thread will handle each client separately
new Thread(clientSock).start();
// Add Client to arraylist
clients.add(clientSock);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (server != null) {
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void sendAll(String line) {
for(int i = 0; i < clients.size(); i++) {
clients.get(i).out.println(line);
}
}
private static class ClientHandler implements Runnable {
private final Socket clientSocket;
public static PrintWriter out = null;
public static BufferedReader in = null;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.printf("Sent from the client: %s\n", line);
sendAll(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null)
in.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Client.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
String host = "127.0.0.1";
int port = 32000;
try (Socket socket = new Socket(host, port)) {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Scanner scanner = new Scanner(System.in);
String line = null;
while (!"exit".equalsIgnoreCase(line)) {
line = scanner.nextLine();
out.println(line);
out.flush();
System.out.println("Server replied " + in.readLine());
}
scanner.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}