Advertisement
Guest User

Untitled

a guest
May 28th, 2015
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.67 KB | None | 0 0
  1.  
  2. import java.io.BufferedReader;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.net.DatagramPacket;
  7. import java.net.DatagramSocket;
  8. import java.net.InetAddress;
  9. import java.net.ServerSocket;
  10. import java.net.Socket;
  11. import java.net.SocketTimeoutException;
  12. import java.util.concurrent.ExecutorService;
  13. import java.util.concurrent.Executors;
  14.  
  15. public class cdht {
  16.  
  17. private static String selfID;
  18. private static String stringFirstSuc;
  19. private static String stringSecondSuc;
  20. private static int port;
  21. private static int firstSuc;
  22. private static int secondSuc;
  23. private static int firstPort;
  24. private static int secondPort;
  25. private static int firstPred = 0;
  26. private static int secondPred = 0;
  27. private static int tmpPred = 0;
  28. private static int firstPredPort;
  29. private static int secondPredPort;
  30. private static int playDead = 0;
  31. public Runnable step3Server;
  32. public Runnable step3Client;
  33.  
  34. public cdht(String[] args) {
  35. selfID = args[0];
  36. stringFirstSuc = args[1];
  37. stringSecondSuc = args[2];
  38. port = 50000 + Integer.parseInt(selfID);
  39. firstSuc = Integer.parseInt(stringFirstSuc);
  40. secondSuc = Integer.parseInt(stringSecondSuc);
  41. firstPort = firstSuc + 50000;
  42. secondPort = secondSuc + 50000;
  43.  
  44.  
  45. //=========================STEP 3===================================================
  46. //Server side
  47. //to run the sub class
  48. final ExecutorService serverProcessingPool = Executors.newFixedThreadPool(10);
  49. step3Server = new Runnable() {
  50. public void run() {
  51. try {
  52. // create server socket
  53. ServerSocket welcomeSocket = new ServerSocket(port);
  54. while(true) {
  55. // accept connection from client
  56. Socket connectionSocket = welcomeSocket.accept();
  57. //launch class in new thread
  58. serverProcessingPool.submit(new ServerTask(connectionSocket));
  59. }
  60. } catch (IOException e){
  61. System.out.println(e.getMessage());
  62. }
  63. }
  64. };
  65. //Client side
  66. step3Client = new Runnable() {
  67. public void run() {
  68. while(true) {
  69. try {
  70. String serverName = "localhost";
  71. InetAddress IPAddress = InetAddress.getByName(serverName);
  72. // create socket which connects to server
  73. Socket clientSocket = new Socket(IPAddress, firstPort);
  74. // get input from keyboard
  75. BufferedReader inFromUser =
  76. new BufferedReader(new InputStreamReader(System.in));
  77. //thread blocked here, waiting to read in input
  78. String line = inFromUser.readLine();
  79. String[] linePart = line.split(" ");
  80. if (linePart[0].equals("request")) {
  81. String file = linePart[1];
  82. // write to server
  83. DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
  84. outToServer.writeBytes(selfID + "-" + file+ "-" + selfID); //selfID so the final peer knows who to reply directly to
  85. System.out.println("File request message for " + file + " has been sent to my successor.");
  86. clientSocket.close();
  87. } else if(linePart[0].equals("quit")){
  88. int playDead = 1; //mark the peer as quit
  89. //update first and second ports
  90. firstPredPort = firstPred + 50000;
  91. secondPredPort = secondPred + 50000;
  92. //start connection with predecessors
  93. Socket firstPredSocket = new Socket(IPAddress, firstPredPort);
  94. Socket secondPredSocket = new Socket(IPAddress, secondPredPort);
  95. //tell predecessors you are leaving and their new successors
  96. DataOutputStream alertFirst = new DataOutputStream(firstPredSocket.getOutputStream());
  97. alertFirst.writeBytes(selfID + "-"+ secondSuc);
  98. DataOutputStream alertSecond = new DataOutputStream(secondPredSocket.getOutputStream());
  99. alertSecond.writeBytes(selfID + "-"+ firstSuc);
  100. //close both sockets
  101. firstPredSocket.close();
  102. secondPredSocket.close();
  103. }
  104. } catch (IOException e) {
  105. System.out.println(e.getMessage());
  106. }
  107. }
  108. }
  109. };
  110. }
  111.  
  112. //private class that will spit the server thread
  113. //Only used by the server from step 3
  114. private class ServerTask implements Runnable {
  115. private final Socket connectionSocket;
  116. private ServerTask(Socket connectionSocket) {
  117. this.connectionSocket = connectionSocket;
  118. }
  119. @Override
  120. public void run() {
  121. try {
  122. InetAddress IPAddress = InetAddress.getByName("localhost");
  123. // create read stream to get input
  124. BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
  125. String objectFile;
  126. objectFile = inFromClient.readLine();
  127. String[] parts = objectFile.split("-");
  128. if(parts.length == 3){
  129. String returnPeer = parts[0]; // peer whom to reply directly to
  130. String fileName = parts[1]; // file name
  131. String pred = parts[2]; //predecessor
  132. int hash = Integer.parseInt(fileName) % 256;
  133.  
  134. //case when returnPeer receives an acknowledgement
  135. if(returnPeer.equals(selfID)){
  136. System.out.println("Received a response message from peer "+pred+", which has the file "+fileName+".");
  137. }
  138.  
  139. //takes the lowest number peer into account when highest peer meets lowest peer
  140. // ie (if predecessor is higher selfID)
  141. else if(
  142. //for files within peer circle (excuding the lowest)
  143. (hash <= Integer.parseInt(selfID)&& hash > Integer.parseInt(pred))
  144. //for files larger than largest peer
  145. ||((Integer.parseInt(pred)>Integer.parseInt(selfID))&& hash > Integer.parseInt(pred))
  146. //for files less than or equal to lowest peer
  147. || ((Integer.parseInt(pred)>Integer.parseInt(selfID))&& hash <= Integer.parseInt(selfID))) {
  148.  
  149. System.out.println("File "+fileName+" is here.");
  150. System.out.println("A response message, destined for peer " + returnPeer + ", has been sent.");
  151.  
  152. //set up connection with original peer
  153. int returnPort = Integer.parseInt(returnPeer) + 50000;
  154. Socket clientReturn = new Socket(IPAddress, returnPort);
  155. DataOutputStream outToClient = new DataOutputStream(clientReturn.getOutputStream());
  156. outToClient.writeBytes(returnPeer + "-" + fileName + "-" + selfID);
  157. clientReturn.close();
  158. } else {
  159. System.out.println("File " + fileName + " is not stored here.");
  160. System.out.println("File request message has been forwarded to my successor.");
  161. Socket clientForward = new Socket(IPAddress, firstPort);
  162. DataOutputStream outToClient = new DataOutputStream(clientForward.getOutputStream());
  163. outToClient.writeBytes(returnPeer + "-" + fileName + "-" + selfID);
  164. clientForward.close();
  165. }
  166. //==================================================================================
  167. //=========================STEP 4===================================================
  168. } else if(parts.length ==2){
  169. //for step 4 quit
  170. String leavingPeer = parts[0].trim();
  171. System.out.println("Peer "+leavingPeer+" will depart from the network.");
  172. if(firstSuc == Integer.parseInt(leavingPeer)){
  173. firstSuc = secondSuc;
  174. }
  175. secondSuc = Integer.parseInt(parts[1]);
  176. firstPort = firstSuc + 50000;
  177. secondPort = secondSuc + 50000;
  178. System.out.println("My first successor is now peer "+firstSuc+".");
  179. System.out.println("My second successor is now peer "+secondSuc+".");
  180. }
  181. connectionSocket.close();
  182. //==================================================================================
  183. } catch (IOException e) {
  184. e.printStackTrace();
  185. }
  186. }
  187. }
  188.  
  189.  
  190. public static void main(String[] args) throws Exception {
  191.  
  192. //multithreading
  193. cdht cdht = new cdht(args);
  194. new Thread(cdht.step3Server).start();
  195. Thread.sleep(1000);
  196. new Thread(cdht.step3Client).start();
  197.  
  198. selfID = args[0];
  199. stringFirstSuc = args[1];
  200. stringSecondSuc = args[2];
  201. port = 50000 + Integer.parseInt(selfID);
  202. firstSuc = Integer.parseInt(stringFirstSuc);
  203. secondSuc = Integer.parseInt(stringSecondSuc);
  204. firstPort = firstSuc + 50000;
  205. secondPort = secondSuc + 50000;
  206.  
  207.  
  208. //=========================STEP 2===================================================
  209. //create IPAddress and socket for sending REQUEST (as client)
  210. InetAddress IPAddress = InetAddress.getByName("localhost");
  211. DatagramSocket socket = new DatagramSocket(); //client
  212.  
  213. //create socket for receiving RESPONSE (as server)
  214. DatagramSocket socket2 = new DatagramSocket(port); //server
  215.  
  216. //packet timeout
  217. socket.setSoTimeout(3000);
  218. socket2.setSoTimeout(3000);
  219.  
  220. while (playDead != 1) {
  221.  
  222. try {
  223. // send REQUEST ping to first successor
  224. byte dataByte[] = selfID.getBytes();
  225. DatagramPacket sendData1 = new DatagramPacket(dataByte,dataByte.length, IPAddress, firstPort);
  226. socket.send(sendData1);
  227.  
  228. // send REQUEST ping to second successor
  229. DatagramPacket sendData2 = new DatagramPacket(dataByte,dataByte.length, IPAddress, secondPort);
  230. socket.send(sendData2);
  231.  
  232. //receiving REQUEST (as server)
  233. byte[] buffer = new byte[1024];
  234. DatagramPacket receiveDataOne = new DatagramPacket(buffer,1024);
  235. socket2.receive(receiveDataOne);
  236. String bufferString = new String(buffer, "UTF-8");
  237. String newBufferString = bufferString.trim();
  238. Integer predNum = Integer.parseInt(newBufferString);
  239. System.out.println("A ping request message was received from Peer " + bufferString + ".\n");
  240. //=========================STEP 4===================================================
  241. //discover predecessors for step 4
  242. //let the largest predecessor be the closest predecessor
  243. if(predNum != firstPred && predNum != secondPred){
  244. if(predNum > tmpPred){
  245. secondPred = tmpPred;
  246. tmpPred = predNum;
  247. } else {
  248. secondPred = predNum;
  249. }
  250. if(tmpPred > firstPred) {
  251.  
  252. firstPred = tmpPred;
  253. }
  254. System.out.println("firstPredecessor is " + firstPred + " secondPredecessor is " + secondPred);
  255. }
  256. //in the case where closest predecessor is smaller than furthest predecessor
  257. else if(firstPred > Integer.parseInt(selfID) && secondPred < Integer.parseInt(selfID)) {
  258. tmpPred = firstPred;
  259. firstPred = secondPred;
  260. secondPred = tmpPred;
  261. System.out.println("firstPredecessor is " + firstPred + " secondPredecessor is " + secondPred);
  262. }
  263. //==================================================================================
  264. //send RESPONSE (as server)
  265. InetAddress clientHost = receiveDataOne.getAddress();
  266. int clientPort = receiveDataOne.getPort();
  267. byte[] response = selfID.getBytes();
  268. DatagramPacket reply = new DatagramPacket(response, response.length, clientHost, clientPort);
  269. socket2.send(reply);
  270.  
  271. //receive RESPONSE as client
  272. byte[] buffer2 = new byte[1024];
  273. DatagramPacket response1 = new DatagramPacket(buffer2, 1024);
  274. socket.receive(response1);
  275. buffer2 = response1.getData();
  276. System.out.println("A ping response message was received from Peer " + new String(buffer2) + ".\n");
  277.  
  278. Thread.sleep((int) (10000)); //remember to update report
  279.  
  280. } catch (SocketTimeoutException e) {
  281. continue;
  282. }
  283. //==================================================================================
  284. }
  285. }
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement