Java - Client/Server-Sockets

From XennisWiki
Jump to: navigation, search

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();
		}
	}
}