Wiem, że temat przewijał jednak nie mogę znaleźć rozwiązania mojego problemu. Napisałem serwer, który w teorii powinien połączyć wiele klientów, klient wysyła wiadomość do serwera, a ten ją rozsyła do wszystkich klientów włącznie z wysyłającym. Poniżej zamieszczam kod:
import java.net.ServerSocket;
import java.net.Socket;
public class ServerChat {
public static void main(String[] args) {
try {
ServerEngine server = new ServerEngine(8189, 20);
while(true) {
Socket s = server.getServerSocket().accept();
server.addConnection(s);
}
} catch(Exception ex) {
System.err.println(ex);
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerEngine {
private ServerSocket serverSocket;
private Socket[] sTab;
private volatile int connections;
public ServerEngine(int port, int maxConnections) throws IOException {
serverSocket = new ServerSocket(port, maxConnections);
sTab = new Socket[maxConnections];
}
public ServerSocket getServerSocket() {
return serverSocket;
}
public void addConnection(Socket s) throws IOException {
synchronized(sTab) {
for(int i = 0; i < sTab.length && sTab != null; i++) {
if(i < sTab.length) {
connections++;
System.out.println("Connections: " + connections);
sTab[i] = s;
Runnable r = new Broadcast(i);
Thread t = new Thread(r);
t.start();
} else {
s.close();
}
}
}
}
public class Broadcast implements Runnable {
public int index;
public Broadcast(int i) {
index = i;
}
public void run() {
try {
synchronized(sTab) {
if(sTab[index] != null) {
InputStream inStream = sTab[index].getInputStream();
OutputStream outStream = sTab[index].getOutputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream, true);
if(in.hasNextLine()) {
String incoming = in.nextLine();
//Close connection if incoming == "disconnect"
if(incoming.equals("disconnect")) {
sTab[index].close();
sTab[index] = null;
connections--;
} else {
out.println(incoming);
}
}
}
}
} catch(IOException ex) {
System.err.println(ex);
}
}
}
}
Serwer nie wchodzi w metodzie addConnection(Socket s) {...} przy warunku w pętli sTab != null, jeżeli go usunę serwer wchodzi w pętlę jednak zapełnia tablicę sTab do końca jednym połączeniem.