196 lines
6.1 KiB
Java
196 lines
6.1 KiB
Java
import java.net.ServerSocket;
|
|
import java.net.Socket;
|
|
import java.util.Scanner;
|
|
import java.io.*;
|
|
import java.util.ArrayList;
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
|
|
|
|
/**
|
|
* Die Klasse MySocket verwaltet eine Client-Server-Verbindung. Sie wartet auf eingehende Nachrichten und
|
|
* informiert ihren Listener, wenn eine Nachricht eingangen ist. Die Nachricht kann dann beim Socket abgeholt werden.
|
|
* Außerdem können Nachrichten in Form von Strings versendet werden.
|
|
* Der Listener wird außerdem informiert, wenn die Verbindung zusammengebrochen / beendet ist.
|
|
* Der Listener muss das Interface MySocketListener implementieren.
|
|
*
|
|
*
|
|
* @version 1.0 vom 15.11.2012
|
|
* @author Thomas Schaller
|
|
*/
|
|
|
|
public class MySocket extends Thread{
|
|
|
|
// Anfang Attribute2
|
|
private boolean aktiv;
|
|
private Socket socket;
|
|
private BufferedReader eingang=null;
|
|
PrintWriter ausgang=null;
|
|
MySocketListener listener=null;
|
|
|
|
// Ende Attribute2
|
|
|
|
/** Dieser Konstruktor erstellt einen MySocket aus einem schon vorhandenen Socket und ist für die Verwendung durch MyServer gedacht.
|
|
* @param s Socket, der durch MySocket verwaltet werden soll.
|
|
* @param listener Listener, der über eingehende Nachrichten und das Beenden der Verbindung informiert wird. Der Listener muss MySocketListener implementieren.
|
|
*/
|
|
public MySocket(Socket s, MySocketListener listener){
|
|
this.socket = s;
|
|
this.listener = listener;
|
|
try {
|
|
eingang = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
|
ausgang = new PrintWriter(socket.getOutputStream());
|
|
aktiv = true;
|
|
this.start();
|
|
} catch(Exception e) {;
|
|
System.out.println(e);
|
|
e.printStackTrace();
|
|
aktiv = false;
|
|
} // end of try
|
|
}
|
|
|
|
/** Dieser Konstruktor erstellt einen neuen Socket. Er verbindet sich mit einem Server an der angegebenen Adresse unter dem angegebenen Port. Der Listener wird
|
|
* über eingehende Nachrichten und das Beenden der Verbindung informiert.
|
|
* @param address IP-Adresse oder Domain-Name des Servers
|
|
* @param port Portnummer, die der Server abhört
|
|
* @param listener Listener, der über eingehende Nachrichten und das Beenden der Verbindung informiert wird. Der Listener muss MySocketListener implementieren.
|
|
*/
|
|
public MySocket(String address, int port, MySocketListener listener) {
|
|
this.listener = listener;
|
|
try {
|
|
this.socket = new Socket(address, port);
|
|
eingang = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
|
ausgang = new PrintWriter(socket.getOutputStream());
|
|
aktiv = true;
|
|
this.start();
|
|
} catch(Exception e) {
|
|
System.out.println(e);
|
|
e.printStackTrace();
|
|
aktiv = false;
|
|
} // end of try
|
|
}
|
|
|
|
// Anfang Methoden2
|
|
/** Verwaltet das Annehmen der Nachrichten (Diese Methode bitte nicht direkt aufrufen, sie wird automatisch gestartet).
|
|
*/
|
|
public void run(){
|
|
try {
|
|
while (aktiv){
|
|
if (listener != null && eingang.ready()) listener.nachrichtEmpfangen(this);
|
|
Thread.sleep(5);
|
|
}
|
|
}
|
|
catch (Exception e) {
|
|
if(socket!=null)try{socket.close();}catch(Exception ex){;}
|
|
System.err.println(e);
|
|
e.printStackTrace();
|
|
}
|
|
aktiv = false;
|
|
if (listener != null) listener.verbindungBeendet(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Liefert die eingangene Nachricht. Diese Methode bitte nur aufrufen, wenn der Listener über den Eingang einer Nachricht informiert wurde, da die Methode sonst bis
|
|
* zur nächsten eingehenden Nachricht wartet.
|
|
* @return Nachricht
|
|
*/
|
|
public String holeNachricht() {
|
|
try{
|
|
|
|
|
|
if (aktiv && eingang.ready()) {
|
|
|
|
String s = eingang.readLine();
|
|
System.out.println(s);
|
|
byte[] b = Base64.decode(s);
|
|
/* for (int i = 0; i < b.length ; i++) {
|
|
System.out.print(b[i]);
|
|
System.out.print(" ");
|
|
} // end of for
|
|
System.out.println("");*/
|
|
|
|
return s;
|
|
} // end of if
|
|
}
|
|
catch(Exception e) {
|
|
e.printStackTrace();
|
|
|
|
return null;
|
|
}
|
|
|
|
|
|
return null;
|
|
}
|
|
|
|
/** Versendet eine Nachricht an den Server.
|
|
* @param nachricht Zu sendender Text.
|
|
*/
|
|
public void sendeNachricht(String nachricht) {
|
|
try {
|
|
//byte[] b = nachricht;
|
|
/* for (int i = 0; i < b.length ; i++) {
|
|
System.out.print(b[i]);
|
|
System.out.print(" ");
|
|
} // end of for
|
|
System.out.println("");*/
|
|
//ausgang.println(Base64.encode(nachricht));
|
|
ausgang.println(nachricht);
|
|
// System.out.println(Base64.encode(nachricht));
|
|
ausgang.flush();
|
|
} catch(Exception e) {
|
|
System.out.println(e);
|
|
e.printStackTrace();
|
|
if (listener != null) listener.verbindungBeendet(this);
|
|
aktiv = false;
|
|
}
|
|
}
|
|
|
|
/** Bricht eine bestehende Client-Server-Verbindung ab.
|
|
*/
|
|
|
|
public void trenneVerbindung() {
|
|
aktiv = false;
|
|
if (socket != null) {
|
|
try {
|
|
socket.close();
|
|
} catch(Exception e) {
|
|
System.out.println(e);
|
|
e.printStackTrace();
|
|
}
|
|
|
|
} // end of if
|
|
socket = null; // end of try
|
|
}
|
|
|
|
/** Liefert den Socket der Verbindung. Kann benutzt werden, um dann aus dem Socket weitere Informationen wie IP-Adressen oder Portnummern zu ermitteln.
|
|
* @return Socket, der Verbindung.
|
|
*/
|
|
public Socket getSocket() {
|
|
return socket;
|
|
}
|
|
|
|
/** Liefert den Status der Verbindung.
|
|
* @return true, falls die Verbindung noch aktiv ist, sonst false.
|
|
*/
|
|
public boolean isAktiv() {
|
|
return aktiv;
|
|
}
|
|
|
|
/** Räumt alles auf, damit der Thread nicht weiterläuft (bitte nicht aufrufen).
|
|
*/
|
|
public void finalize() {
|
|
// Schließen der Streams und des Sockets, wenn
|
|
// die Verbindung gelöscht wird wird
|
|
try {
|
|
trenneVerbindung();
|
|
}
|
|
catch(Exception e) {
|
|
System.out.println(e);
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
// Ende Methoden2
|
|
}
|