Java - Client/Server-Sockets
Zuerst muss der Server (Server.java) gestartet und dann der Client (Client.java) ausgeführt werden. Für weitere Information siehe: Beschreibungen in den Klassen.
Client.java
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* Der Client fordert den Benutzer auf, über die Konsole drei Werte einzugeben
* (siehe hier für Beschreibung der Klasse {@link Server}). Diese werden an den
* Server geschickt, dort verarbeitet und das Ergebnis wieder zurück geschickt.
*/
public class Client {
public static void main(String args[]) {
try {
// Client-Socket anlegen, mit dem Server verbinden
Socket clientSocket = new Socket("localhost", Server.PORT);
// Eingabestrom anlegen
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
// Ausgabestrom anlegen, mit Socket verbinden
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
// Eingabestrom anlegen, mit Socket verbinden
DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream());
/*
* Zeilen einlesen und an Server schicken
*/
System.out.println("Eingabe: 1 Zahl");
int n0 = Integer.parseInt(inFromUser.readLine());
outToServer.writeInt(n0);
System.out.println("Eingabe: 2 Zahl");
int n1 = Integer.parseInt(inFromUser.readLine());
outToServer.writeInt(n1);
System.out.println("Eingabe: Operation (1=Addition, 2=Subtraktion, 3=Multiplikation, 4=Division)");
int op = Integer.parseInt(inFromUser.readLine());
outToServer.writeInt(op);
// Zeile vom Server lesen
int result = inFromServer.readInt();
System.out.println("FROM SERVER result=" + result);
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Server.java
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Der Server wartet auf drei Integer-Werter vom Client. Die ersten beiden sind
* zwei Zahlen und die dritte die Nummer für die auszuführende Operation (siehe
* Konstanten).
*
* Der Server führt die entsprechende Berechnung (z.B. 1Zahl + 2Zahl) aus und
* schickt das Ergebnis zurück an den Client.
*/
public class Server {
public static final int PORT = 7374;
public static final int OP_ADD = 1;
public static final int OP_SUB = 2;
public static final int OP_MUL = 3;
public static final int OP_DIV = 4;
public static void main(String args[]) {
try {
// Socket für eingehende Anfragen anlegen
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server@" + PORT + " sagt: Hallo :D");
while (true) {
// An diesem Socket auf Anfragen von Clients warten
Socket connectionSocket = serverSocket.accept();
// Eingabestrom anlagen, mit Socket verbinden
DataInputStream inFromClient = new DataInputStream(connectionSocket.getInputStream());
// Ausgabestrom anlegen, mit Socket verbinden
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
// Zahlen vom Socket lesen
int num0 = inFromClient.readInt();
int num1 = inFromClient.readInt();
int operation = inFromClient.readInt();
int result;
switch (operation) {
case OP_ADD:
result = num0 + num1;
break;
case OP_SUB:
result = num0 - num1;
break;
case OP_MUL:
result = Math.round(num0 * num1);
break;
case OP_DIV:
if(num0 != 0) result = Math.round(num0 / num1);
else result = 42;
break;
default:
result = 0;
break;
}
// Zahl an Client schicken
outToClient.writeInt(result);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}