/* * 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.pieShareServer.services; import java.io.ByteArrayInputStream; import java.io.PrintWriter; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; import org.pieShare.pieShareServer.model.UserData; import org.pieShare.pieShareServer.services.api.IUserPersistenceService; import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger; /** * * @author RicLeo00 */ public class InputTask implements Runnable { private IUserPersistenceService userPersistenceService; private DatagramSocket ds; private String connectionMsg = "{\"type\":\"connection\", \"client\":%s}"; private String registerMsg = "{\"type\":\"connectionInfo\", \"name\":\"%s\", \"localAddress\":\"%s\", \"localPort\":%s, \"privateAddress\":\"%s\", \"privatePort\":%s}"; public void setUserPersistenceService(IUserPersistenceService userPersistenceService) { this.userPersistenceService = userPersistenceService; } public void run() { try { System.out.println("Server waiting"); byte[] bytes = new byte[1024]; ds = new DatagramSocket(6312); while (true) { DatagramPacket p = new DatagramPacket(bytes, bytes.length); ds.receive(p); JsonObject input = processInput(p.getData()); if (input.getString("type").equals("register")) { UserData data = new UserData(); String connectionInfo = String.format(registerMsg, input.getString("name"), input.getString("localAddress"), input.getInt("localPort"), p.getAddress().toString().replace("/", ""), p.getPort()); data.setConnectionInfo(processInput(connectionInfo.getBytes())); data.setTask(this); userPersistenceService.addUser(input.getString("name"), data); PieLogger.info(this.getClass(), String.format("User: %s successful registered.", input.getString("name"))); } else if (input.getString("type").equals("connect")) { UserData from = userPersistenceService.getUser(input.getString("from")); UserData to = userPersistenceService.getUser(input.getString("to")); to.getTask().sendData(String.format(connectionMsg, from.getConnectionInfo().toString()), to); Thread.sleep(2000); from.getTask().sendData(String.format(connectionMsg, to.getConnectionInfo().toString()), from); } } // ds.close(); } catch (Exception e) { e.printStackTrace(); } } public JsonObject processInput(byte[] input) { ByteArrayInputStream byteInStream = new ByteArrayInputStream(input); JsonReader jsonReader = Json.createReader(byteInStream); JsonObject ob = jsonReader.readObject(); PieLogger.info(this.getClass(), String.format("ConnectionText: %s", ob.toString())); return ob; } public void sendData(String msg, UserData data) {//), String host, int port) { byte[] bA; bA = msg.getBytes(); DatagramPacket pck; try { PieLogger.debug(this.getClass(), String.format("Sending data to Host: %s with Port: %s", data.getConnectionInfo().getString("privateAddress"), data.getConnectionInfo().getInt("privatePort"))); pck = new DatagramPacket(bA, bA.length, InetAddress.getByName(data.getConnectionInfo().getString("privateAddress")), data.getConnectionInfo().getInt("privatePort")); ds.send(pck); } catch (Exception e) { e.printStackTrace(); } } }