Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.37 KB | None | 0 0
  1. import java.io.*;
  2. import java.net.InetAddress;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import java.util.*;
  6.  
  7. public class FileTracker {
  8. /*
  9. ** Local fields
  10. */
  11. private ServerSocket ftSocket;
  12. private boolean isServerOn = true;
  13. private Hashtable<String, ArrayList<FileInstance>> records = new Hashtable<>();
  14. private HashMap<INETAddr, Score> board = new HashMap<>();
  15.  
  16.  
  17. public FileTracker() {
  18. try {
  19. ftSocket = new ServerSocket(3333);
  20. } catch(IOException ioe) {
  21. System.out.println("Cannot create server socket on port 3333...");
  22. System.exit(-1);
  23. }
  24.  
  25. while (isServerOn) {
  26. try {
  27. Socket peerSock = ftSocket.accept();
  28. PeerServiceThread peerThread = new PeerServiceThread(peerSock);
  29. peerThread.start();
  30. } catch(IOException ioe) {
  31. System.out.println("Exception on accepting");
  32. ioe.printStackTrace();
  33. }
  34. }
  35.  
  36. try {
  37. ftSocket.close();
  38. System.out.println("FileTracker stopped");
  39. } catch(IOException ioe) {
  40. System.out.println("Error found on closing server socket");
  41. System.exit(-1);
  42. }
  43. }
  44.  
  45. private void initRecords() {
  46. ArrayList<FileInstance> a1 = new ArrayList<>();
  47. a1.add(new FileInstance("pdf", 258, "07/02/2018", "192.168.0.5", 7777));
  48. a1.add(new FileInstance("txt", 3, "17/03/2018", "192.168.1.5", 8741));
  49. records.put("Exam", a1);
  50.  
  51. ArrayList<FileInstance> a2 = new ArrayList<>();
  52. a2.add(new FileInstance("jpeg", 1258, "07/02/2018", "192.168.120.5", 7777));
  53. a2.add(new FileInstance("txt", 12343, "17/03/2018", "192.168.120.5", 7777));
  54. records.put("nu", a2);
  55.  
  56. ArrayList<FileInstance> a3 = new ArrayList<>();
  57. a3.add(new FileInstance("pdf", 128, "07/02/2018", "95.5.0.5", 3333));
  58. records.put("OS-Solutions-Final", a3);
  59. }
  60.  
  61. private String recordsLookup() {
  62. Set<String> keys = records.keySet();
  63. String rsp = "";
  64. for (String key : keys) {
  65. rsp += key + ":";
  66. for (int i = 0; i < records.get(key).size(); ++i) {
  67. if (i != 0) rsp += "->";
  68. rsp += records.get(key).get(i).getFileType() + ", " +
  69. records.get(key).get(i).getFileSize() + ", " +
  70. records.get(key).get(i).getLastModifiedDate() + "," +
  71. records.get(key).get(i).getIpAddr() + ":" +
  72. records.get(key).get(i).getPortNum();
  73. }
  74. rsp += "\n";
  75. }
  76. return rsp;
  77. }
  78.  
  79. private String boardLookup() {
  80. String rsp = "";
  81. for (INETAddr key : board.keySet()) {
  82. rsp += key.getIpAddr() + ":" + key.getPort() + "-" + board.get(key).getNumOfUploads() + "/"
  83. + board.get(key).getNumOfRequests() + "\n";
  84. }
  85. return rsp;
  86. }
  87.  
  88.  
  89.  
  90.  
  91. public static void main(String argsp[]) throws Exception {
  92. new FileTracker();
  93. }
  94.  
  95.  
  96. /*
  97. ** Additional classes
  98. */
  99.  
  100. /* Peer handler threaded class */
  101. class PeerServiceThread extends Thread {
  102. private Socket pSocket;
  103. private int port;
  104.  
  105. public PeerServiceThread() {
  106. super();
  107. }
  108.  
  109. PeerServiceThread(Socket s) {
  110. pSocket = s;
  111. }
  112.  
  113. public void run() {
  114. BufferedReader in = null;
  115. DataOutputStream out = null;
  116. System.out.println("Connected peer addr - " + pSocket.getInetAddress().getHostAddress());
  117.  
  118. try {
  119. in = new BufferedReader(new InputStreamReader(pSocket.getInputStream()));
  120. out = new DataOutputStream(pSocket.getOutputStream());
  121. while (true) {
  122. String req = in.readLine();
  123. String[] params = req.split(":");
  124. System.out.println(req);
  125.  
  126. if (params[0].equals("HELLO")) {
  127. out.writeBytes("HI\r\n");
  128. out.flush();
  129. String filesReq = in.readLine();
  130. if (filesReq.length() == 0) {
  131. out.writeBytes("NOT ACCEPTED\r\n");
  132. out.flush();
  133. return;
  134. } else {
  135. int port = 0;
  136. String[] files = filesReq.split("\\|");
  137. for (int i = 0; i < files.length; ++i) {
  138. String[] fileAttr = files[i].split(",");
  139. port = Integer.parseInt(fileAttr[4]);
  140. this.port = port;
  141. if (records.get(fileAttr[0]) != null) {
  142. records.get(fileAttr[0]).add(
  143. new FileInstance(
  144. fileAttr[1],
  145. Integer.parseInt(fileAttr[2]),
  146. fileAttr[3],
  147. pSocket.getInetAddress().getHostAddress(),
  148. Integer.parseInt(fileAttr[4])));
  149. } else {
  150. ArrayList<FileInstance> al = new ArrayList<>();
  151. al.add(new FileInstance(
  152. fileAttr[1],
  153. Integer.parseInt(fileAttr[2]),
  154. fileAttr[3],
  155. pSocket.getInetAddress().getHostAddress(),
  156. Integer.parseInt(fileAttr[4])));
  157. records.put(fileAttr[0], al);
  158. }
  159. }
  160. out.writeBytes("ACCEPTED\r\n");
  161. out.flush();
  162. if (!board.containsKey(new INETAddr(pSocket.getInetAddress().getHostAddress(), port))) {
  163. board.put(new INETAddr(pSocket.getInetAddress().getHostAddress(), port), new Score());
  164. }
  165. }
  166. }
  167.  
  168. if (params[0].equals("SEARCH")) {
  169. Set<String> keys = records.keySet();
  170. String rsp = "FOUND: ";
  171. String fileName = params[1].substring(1);
  172. int x, y, p;
  173. for (String key : keys) {
  174. if (key.equals(fileName)) {
  175. for (int i = 0; i < records.get(key).size(); ++i) {
  176. if (i != 0) rsp += "->";
  177. y = board.get(new INETAddr(records.get(key).get(i).getIpAddr(),
  178. records.get(key).get(i).getPortNum())).getNumOfUploads();
  179. p = board.get(new INETAddr(records.get(key).get(i).getIpAddr(),
  180. records.get(key).get(i).getPortNum())).getNumOfRequests();
  181. if (p == 0)
  182. x = 0;
  183. else
  184. x = y / p;
  185. rsp += records.get(key).get(i).getFileType() + ", " +
  186. records.get(key).get(i).getFileSize() + ", " +
  187. records.get(key).get(i).getLastModifiedDate() + ", " +
  188. records.get(key).get(i).getIpAddr() + ":" +
  189. records.get(key).get(i).getPortNum() + ", " + x + "%";
  190.  
  191.  
  192. }
  193.  
  194. }
  195. }
  196. if (rsp.equals("FOUND: ")) {
  197. rsp = "NOT FOUND";
  198. }
  199. out.writeBytes(rsp + "\r\n");
  200. out.flush();
  201. }
  202.  
  203. if (params[0].equals("SCORE")) {
  204. Score old = board.get(new INETAddr(params[1], Integer.parseInt(params[2])));
  205. old.setNumOfRequests(old.getNumOfRequests() + 1);
  206. old.setNumOfUploads(old.getNumOfUploads() + Integer.parseInt(params[3]));
  207. board.put(new INETAddr(params[1], Integer.parseInt(params[2])), old);
  208. System.out.println(boardLookup());
  209. }
  210.  
  211. if (params[0].equals("BYE")) {
  212. Iterator<Map.Entry<String, ArrayList<FileInstance>>> it = records.entrySet().iterator();
  213.  
  214. while (it.hasNext()) {
  215. Map.Entry<String, ArrayList<FileInstance>> entry = it.next();
  216.  
  217. Iterator<FileInstance> fit = entry.getValue().iterator();
  218. while (fit.hasNext()) {
  219. FileInstance f = fit.next();
  220. if (f.getIpAddr().equals(pSocket.getInetAddress().getHostAddress())
  221. && f.getPortNum() == port) {
  222. fit.remove();
  223. }
  224. }
  225.  
  226. // Remove entry if key is null or equals 0.
  227. if (entry.getValue().size() == 0) {
  228. it.remove();
  229. }
  230. }
  231. System.out.println(recordsLookup());
  232.  
  233. }
  234.  
  235. }
  236. } catch(Exception e) {
  237. System.out.println(pSocket.getInetAddress().getHostAddress() + "Peer has been disconnected");
  238. }
  239. finally {
  240. try {
  241. in.close();
  242. out.close();
  243. pSocket.close();
  244. System.out.println(pSocket.getInetAddress().getHostAddress() + "Peer was kicked from the service");
  245. } catch (IOException ioe) {
  246. ioe.printStackTrace();
  247. }
  248. }
  249. }
  250.  
  251. }
  252.  
  253.  
  254. /* Class for storing the file information in records hashtable: value */
  255. class INETAddr {
  256. public String getIpAddr() {
  257. return ipAddr;
  258. }
  259.  
  260. public int getPort() {
  261. return port;
  262. }
  263.  
  264. @Override
  265. public int hashCode() {
  266. final int prime = 31;
  267. int result = 1;
  268. result = prime * result + ipAddr.hashCode();
  269. result = prime * result + port;
  270. return result;
  271. }
  272.  
  273. @Override
  274. public boolean equals(Object obj) {
  275.  
  276. if (this == obj)
  277. return true;
  278. if (obj == null)
  279. return false;
  280. if (getClass() != obj.getClass())
  281. return false;
  282. INETAddr other = (INETAddr) obj;
  283. if (!ipAddr.equals(other.ipAddr))
  284. return false;
  285. if (port != other.port)
  286. return false;
  287. return true;
  288. }
  289.  
  290. private String ipAddr;
  291. private int port;
  292.  
  293. public INETAddr(String ipAddr, int port) {
  294. this.ipAddr = ipAddr;
  295. this.port = port;
  296. }
  297.  
  298. }
  299.  
  300. class Score {
  301. private int numOfUploads;
  302.  
  303. public int getNumOfUploads() {
  304. return numOfUploads;
  305. }
  306.  
  307. public void setNumOfUploads(int numOfUploads) {
  308. this.numOfUploads = numOfUploads;
  309. }
  310.  
  311. public int getNumOfRequests() {
  312. return numOfRequests;
  313. }
  314.  
  315. public void setNumOfRequests(int numOfRequests) {
  316. this.numOfRequests = numOfRequests;
  317. }
  318.  
  319. private int numOfRequests;
  320.  
  321. public Score() {
  322. this.numOfUploads = 0;
  323. this.numOfRequests = 0;
  324. }
  325. }
  326.  
  327. class FileInstance {
  328. private String fileType;
  329.  
  330. public String getFileType() {
  331. return fileType;
  332. }
  333.  
  334. public int getFileSize() {
  335. return fileSize;
  336. }
  337.  
  338. public String getLastModifiedDate() {
  339. return lastModifiedDate;
  340. }
  341.  
  342. public String getIpAddr() {
  343. return ipAddr;
  344. }
  345.  
  346. public int getPortNum() {
  347. return portNum;
  348. }
  349.  
  350. private int fileSize;
  351. private String lastModifiedDate;
  352. private String ipAddr;
  353. private int portNum;
  354.  
  355. public FileInstance(String fileType, int fileSize, String lastModifiedDate, String ipAddr, int portNum) {
  356. this.fileType = fileType;
  357. this.fileSize = fileSize;
  358. this.lastModifiedDate = lastModifiedDate;
  359. this.ipAddr = ipAddr;
  360. this.portNum = portNum;
  361. }
  362. }
  363.  
  364. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement