sengels1/RvS — Issue #1: Server.java
Author: sengels1
Created: 2011-11-04 09:00:34+00:00
State: open

import java.io.IOException;
import java.io.*;
import java.net.*;

/**
* Implementierung von AServer. Eine genaue Beschreibung der Aufgaben der
* einzelnen Methoden befindet sich in AServer.java. Diese Datei darf veraendert
* werden. Wenn Sie weitere Methoden oder Attribute benoetigen, duerfen sie
* einfuegen.
*/
public final class Server extends AServer {
int maxConnections = 100;
ServerSocket server;
String message;
Socket[] connections = new Socket[maxConnections];
BufferedReader[] inputStreams = new BufferedReader[maxConnections];
PrintWriter[] outputStreams = new PrintWriter[maxConnections];
String[] clientIDs = new String[maxConnections];
int socketPointer = 0;

public Server(int port) throws IOException {
super(port);
}

@Override
void openPort(int port) throws IOException {
// Oeffnet einen Port mit einem lauschenden Socket
try{
server = new ServerSocket(port);
}
catch(IOException e){
//Fehlerbehandlung
System.out.println("Fehler beim Erzeugen des Sockets! "+e);
System.exit(1);
}

}

@Override
void acceptConnection() throws IOException {
while(true){
if(socketPointer < maxConnections){
connections[socketPointer] = server.accept();
inputStreams[socketPointer] = new BufferedReader(new InputStreamReader(connections[socketPointer].getInputStream()));
outputStreams[socketPointer] = new PrintWriter(connections[socketPointer].getOutputStream(), true);
//ID des Client einlesen
String id=inputStreams[socketPointer].readLine();
//als Integer parsen
int id1=-1;
try {
id1 = Integer.parseInt (id);
}
catch (Exception E){
System.out.println("Fehler beim Umwandeln in int");
System.exit(0);
}
//überprüfen, ob schon eine Verbindung mit dem Client besteht, wenn ja abbrechen
if(isConnected(id1)){
System.out.println("Es besteht schon eine Verbindung zum Client: "+id);
System.exit(0);
}
//sonst neue Verbindung hinzufügen
clientIDs[socketPointer] = id;
System.out.println("New Connection with Client: "+clientIDs[socketPointer]);
socketPointer++;
}
}
}

@Override
public String receiveMessage(int x) throws IOException {
int position = 999;
try{
for(int i = 0; i < socketPointer; i++){
if (clientIDs[i].equals(""+x)){
position = i;
}
}
if(position == 999){
return null;
}else{
return inputStreams[position].readLine();
}
}
catch(IOException ioException){
ioException.printStackTrace();
return null;
}
}

@Override
public void sendMessage(int x, String message) throws IOException {
for(int i = 0; i < socketPointer; i++){
if (clientIDs[i].equals(""+x)){
outputStreams[i].println(message);
}
}
}

@Override
public int connectionCount() {
return socketPointer;
}

@Override
public void disconnect() {
//
for (int i = 0; i < socketPointer; i++){
disconnect(i);
}
socketPointer=0;

}

@Override
public void disconnect(int x) {
try{
//Schließe alle Verbindungen mit Client x
connections[x].close();
inputStreams[x].close();
outputStreams[x].close();
}
catch(IOException ioException){
//Fehlerbehandlung
ioException.printStackTrace();
}
}

@Override
boolean isConnected(int x) {
//Gibt an, ob eine Verbindung zu dem Client mit der ID x besteht.
//Dazu Feld der IDs einmal durchsuchen
for(int i = 0; i < socketPointer; i++){
if (clientIDs[i].equals(""+x)){
return true;
}
}
return false;
}

@Override
boolean isConnected() {
//gibt an, ob der lauschende Port geoeffnet ist.
//lauschende Port ist geoeffnet, wenn server ungleich null
return server!=null;
}
}