Hello. I want to create a Java server that will allow 2 or more sockets to communicate with each other. I tried this with the code shown below and the second client to connect can send to the first one, but the first to connect cannot send to the second client.
Code to accept two sockets:
MessageServer.java:
package io.github.sirender125.Server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
public class MessageServer {
private int port;
private ServerSocket serverSocket;
private LinkedList<ClientHandler> clientHandlers = new LinkedList<>();
public MessageServer(int port) {
this.port = port;
}
public void start() throws IOException {
serverSocket = new ServerSocket(port);
System.out.printf("Server started on port %d.", port);
for (int i = 0; i < 2; i++) {
Socket client = serverSocket.accept();
System.out.println("A client connected.\n");
ClientHandler ch = new ClientHandler(client, this);
clientHandlers.add(ch);
ch.start();
}
}
public long getClientCount() {
return clientHandlers.size();
}
public void broadcast(String message, ClientHandler exclude) {
for (ClientHandler ch : clientHandlers) {
if (ch != exclude) {
ch.sendMessage(message);
}
}
}
public void kickClient(ClientHandler client) {
clientHandlers.remove(client);
client.interrupt();
}
}
ClientHandler.java:
package io.github.sirender125.Server;
import java.io.*;
import java.net.*;
public class ClientHandler extends Thread {
private Socket client;
private BufferedReader reader;
private PrintWriter writer;
private MessageServer messageServer;
public ClientHandler(Socket socket, MessageServer messageServer) throws IOException {
this.client = socket;
this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
this.writer = new PrintWriter(socket.getOutputStream(), true);
this.messageServer = messageServer;
}
@Override
public void run() {
while (messageServer.getClientCount() == 1) {
}
String line;
while (messageServer.getClientCount() > 1) {
try {
if ((line = reader.readLine()) != null) {
if (line.startsWith("message::")) {
messageServer.broadcast(line.substring(9), this);
}
else if (line.equals("exit")) {
messageServer.kickClient(this);
client.close();
}
}
}
catch (IOException ioe) {
ioe.printStackTrace();
try {
client.close();
}
catch (IOException ioe1) {
ioe1.printStackTrace();
}
}
}
try {
client.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
public void sendMessage(String message) {
writer.println("message::" + message);
}
public void kick() {
}
}
Main.java:
package io.github.sirender125.Server;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
if (args.length == 1) {
int port = Integer.parseInt(args[0]);
MessageServer messageServer = new MessageServer(port);
try {
messageServer.start();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
else {
System.err.println("Please pass valid arguments. (<port>)");
}
}
}
I'm sure that this code has a lot of problems and such. I am no pro. Please point them out and address any apparent reasons for the problem stated above.
Also, I am not sure whether I need to give you the client code, but I can if it would help. The problem seems server-related to me though.
What I have tried:
Rewriting the server code from scratch. (So it maybe the client's fault?)