/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.pieShare.pieShareClient.services; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; import org.pieShare.pieShareClient.api.Callback; import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger; /** * * @author Richard */ public class Client { private DatagramSocket socket; private final ExecutorService executor; private String name = null; private ClientSendTask sendTask; private ClientTask task; private int localPort = 4321; public Client() { task = new ClientTask(); sendTask = new ClientSendTask(); task.setSendTask(sendTask); executor = Executors.newCachedThreadPool(); } public void connect(String from, String to, int port) { if (port != -1) { this.localPort = port; } try { socket = new DatagramSocket(localPort); } catch (SocketException ex) { Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); } this.name = from; String serverAddress = "server.piesystems.org";//"128.130.172.205";//"richy.ddns.net";//"192.168.0.22"; int serverPort = 6312; String registerMsg = "{\"type\":\"register\", \"name\":\"%s\", \"localAddress\":\"%s\", \"localPort\":%s, \"privateAddress\":\"%s\", \"privatePort\":%s}"; String connectMsg = "{\"type\":\"connect\", \"from\":\"%s\", \"to\":\"%s\"}"; String ackMsg = "{\"type\":\"ACK\", \"from\":\"%s\"}"; String registerAndConnectMag = "{\"type\":\"registerAndConnect\", \"regMsg\":%s, \"connectMsg\":%s}"; task.setSocket(socket); sendTask.setSocket(socket); sendTask.setName(name); task.setCallback(new Callback() { public void Handle(JsonObject client) { sendTask.setConnectionData(client); sendTask.setHost(client.getString("privateAddress")); sendTask.setPort(client.getInt("privatePort")); executor.execute(sendTask); } }); executor.execute(task); try { InetAddress IP = InetAddress.getLocalHost(); String localIP = IP.getHostAddress(); String text = String.format(registerMsg, from, localIP, localPort, localIP, localPort); DatagramPacket packet = new DatagramPacket(text.getBytes(), text.length(), InetAddress.getByName(serverAddress), serverPort); socket.send(packet); //Remove this by insert new message for registering and ocnnecting at same time try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); } if (to != null) { text = String.format(connectMsg, from, to); packet = new DatagramPacket(text.getBytes(), text.length(), InetAddress.getByName(serverAddress), serverPort); socket.send(packet); } } catch (UnknownHostException ex) { Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); } } public JsonObject processInput(String input) { ByteArrayInputStream byteInStream = new ByteArrayInputStream(input.getBytes()); JsonReader jsonReader = Json.createReader(byteInStream); JsonObject ob = jsonReader.readObject(); PieLogger.info(this.getClass(), String.format("ConnectionText: %s", ob.toString())); return ob; } }