package network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
public class TCP {
public static interface ResponseListener {
public void onResponse(String responseMessage);
}
public static class Client {
private Socket mySocket;
private PrintWriter myWriter;
private BufferedReader myReader;
public Client(String serverIp, int serverPort) {
try {
mySocket = new Socket(serverIp, serverPort);
myWriter = new PrintWriter(mySocket.getOutputStream());
myReader = new BufferedReader(new InputStreamReader(
mySocket.getInputStream()));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void killConnection() {
try {
mySocket.close();
System.out.println("TCP Client killed by user");
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(final String message, final ResponseListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
myWriter.println(message);
System.out
.println("TCP Client send message, waiting for response");
listener.onResponse(myReader.readLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
public static interface MessageListener {
public void onMessage(String message, Responder response);
}
public static class Responder {
private PrintWriter myWriter;
public Responder(PrintWriter printWriter) {
myWriter = printWriter;
}
public void send(String response) {
myWriter.println(response);
System.out.println("TCP Server send response=" + response);
}
}
public static class Server {
// private ServerSocket myServerSocket;
// private MessageListener myListener;
private boolean running = true;
public void waitForMessage(int port, MessageListener listener) {
try {
final ServerSocket myServerSocket = new ServerSocket(port);
final MessageListener myListener = listener;
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out
.println("TCP Server waiting for connection");
Socket socket = myServerSocket.accept();
BufferedReader inputStream = new BufferedReader(
new InputStreamReader(socket
.getInputStream()));
Responder response = new Responder(new PrintWriter(
socket.getOutputStream(), true));
System.out
.println("TCP Server has connection, waiting for message");
while (running) {
System.out
.println("TCP Server is waiting for a new Line");
myListener.onMessage(inputStream.readLine(),
response);
}
System.out
.println("TCP Server stoped, closing connection");
socket.close();
myServerSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void killServer() {
System.out.println("TCP Server killed by user");
running = false;
}
}
/**
* iterates over all network interfaces (3G, WiFi,..) to find the ip
*
* @return null if there is no connection available
*/
public static String getDeviceIp() {
try {
for (Enumeration<NetworkInterface> interfaces = NetworkInterface
.getNetworkInterfaces(); interfaces.hasMoreElements();) {
NetworkInterface netInterface = interfaces.nextElement();
for (Enumeration<InetAddress> ipAddresses = netInterface
.getInetAddresses(); ipAddresses.hasMoreElements();) {
InetAddress inetAddress = ipAddresses.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return null;
}
}