Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.18 KB | None | 0 0
  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.BufferedReader;
  4. import java.io.ByteArrayInputStream;
  5. import java.io.ByteArrayOutputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.InputStreamReader;
  10. import java.io.ObjectInputStream;
  11. import java.io.ObjectOutputStream;
  12. import java.net.DatagramPacket;
  13. import java.net.DatagramSocket;
  14. import java.net.InetAddress;
  15. import java.net.SocketException;
  16. import java.net.UnknownHostException;
  17. import java.util.Hashtable;
  18.  
  19. public class ChatClient {
  20.  
  21. static final int PORT = 2222;
  22. static final String FileNotFoundMessage = "Error: File Not Found";
  23. static final String OKMessage = "OK";
  24.  
  25. static Hashtable<Integer, DataPacket> hashPackets;
  26.  
  27. public static void main(String[] args) {
  28.  
  29. try {
  30. DatagramSocket s = new DatagramSocket();
  31.  
  32. byte[] buf = new byte[1000];
  33. DatagramPacket dp = new DatagramPacket(buf, buf.length);
  34.  
  35. InetAddress hostAddress = InetAddress.getByName("localhost");
  36. BufferedReader stdin;
  37. String filename;
  38. System.out.print("Please enter file name: ");
  39. //stdin = new BufferedReader(new InputStreamReader(System.in));
  40. //filename = stdin.readLine();
  41. filename ="file.txt";
  42.  
  43. String outString = filename;
  44. buf = outString.getBytes();
  45.  
  46. // send file name
  47. DatagramPacket out = new DatagramPacket(buf, buf.length, hostAddress, PORT);
  48. s.send(out);
  49.  
  50. // receive response
  51. s.receive(dp);
  52. String rcvd = new String(dp.getData(), 0, dp.getLength());
  53.  
  54. if (rcvd.equals(FileNotFoundMessage)) {
  55. // file not found
  56. System.out.println("Server say: " + FileNotFoundMessage);
  57. } else {
  58.  
  59. String[] parts = rcvd.split(" ");
  60. if (parts.length == 2 && parts[0].equals(OKMessage)) {
  61. int numOfChunks = Integer.valueOf(parts[1]);
  62. receiveFileFromSrever(filename, numOfChunks, s, out);
  63. } else {
  64. // message not recognized
  65. System.out.println("Server Message is not recognized: " + rcvd);
  66. }
  67.  
  68. }
  69.  
  70. } catch (SocketException e) {
  71. e.printStackTrace();
  72. } catch (UnknownHostException e) {
  73. e.printStackTrace();
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. }
  77.  
  78. }
  79.  
  80. public static void receiveFileFromSrever(String filename, int numOfChunks, DatagramSocket s, DatagramPacket dgp) {
  81.  
  82. hashPackets = new Hashtable<Integer, DataPacket>();
  83.  
  84. try {
  85. FileOutputStream fos = new FileOutputStream(filename);
  86.  
  87. int currentPacket = 0; // packet number should be received next
  88. DataPacket packet;
  89. AckPacket ackPacket;
  90.  
  91. while (currentPacket < numOfChunks) {
  92.  
  93. if (hashPackets.containsKey(currentPacket)) {
  94. packet = hashPackets.remove(currentPacket++);
  95. fos.write(packet.data);
  96. } else {
  97. // send ack
  98. if (currentPacket != 0) {
  99. System.out.println("send ack: " + (currentPacket - 1));
  100. ackPacket = new AckPacket(0, currentPacket - 1);
  101. sendObjectToClient(ackPacket, dgp.getAddress(), dgp.getPort(), s);
  102. }
  103.  
  104. packet = (DataPacket) recvObjFrom(s); // receive chunk
  105. System.out.println("recieved packet: " + packet.seqno);
  106. if (packet.seqno == (currentPacket)) {
  107. currentPacket++;
  108. fos.write(packet.data);
  109. } else {
  110. if (!hashPackets.containsKey(packet.seqno) && packet.seqno > currentPacket)
  111. hashPackets.put(packet.seqno, packet);
  112. }
  113. }
  114. }
  115. fos.close();
  116. // send ack of last packet
  117. System.out.println("send ack: " + (numOfChunks - 1));
  118. ackPacket = new AckPacket(0, numOfChunks - 1);
  119. sendObjectToClient(ackPacket, dgp.getAddress(), dgp.getPort(), s);
  120.  
  121. } catch (FileNotFoundException e) {
  122. e.printStackTrace();
  123. } catch (IOException e) {
  124. e.printStackTrace();
  125. }
  126.  
  127. }
  128.  
  129. public static void sendObjectToClient(Object o, InetAddress address, int desPort, DatagramSocket dSock) {
  130. try {
  131. ByteArrayOutputStream byteStream = new ByteArrayOutputStream(5000);
  132. ObjectOutputStream os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
  133. os.flush();
  134. os.writeObject(o);
  135. os.flush();
  136. // retrieves byte array
  137. byte[] sendBuf = byteStream.toByteArray();
  138. DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, address, desPort);
  139. int byteCount = packet.getLength();
  140. dSock.send(packet);
  141. os.close();
  142. } catch (UnknownHostException e) {
  143. System.err.println("Exception: " + e);
  144. e.printStackTrace();
  145. } catch (IOException e) {
  146. e.printStackTrace();
  147. }
  148. }
  149.  
  150. public void recieveAndSend() {
  151. try {
  152. DatagramSocket s = new DatagramSocket();
  153.  
  154. byte[] buf = new byte[1000];
  155. DatagramPacket dp = new DatagramPacket(buf, buf.length);
  156.  
  157. InetAddress hostAddress = InetAddress.getByName("localhost");
  158. while (true) {
  159. BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
  160. String outMessage = stdin.readLine();
  161.  
  162. if (outMessage.equals("bye"))
  163. break;
  164. String outString = "Client say: " + outMessage;
  165. buf = outString.getBytes();
  166.  
  167. DatagramPacket out = new DatagramPacket(buf, buf.length, hostAddress, PORT);
  168. s.send(out);
  169.  
  170. s.receive(dp);
  171. String rcvd = "rcvd from " + dp.getAddress() + ", " + dp.getPort() + ": "
  172. + new String(dp.getData(), 0, dp.getLength());
  173. System.out.println(rcvd);
  174. }
  175.  
  176. } catch (SocketException e) {
  177. e.printStackTrace();
  178. } catch (UnknownHostException e) {
  179. e.printStackTrace();
  180. } catch (IOException e) {
  181. e.printStackTrace();
  182. }
  183.  
  184. }
  185.  
  186. public static Object recvObjFrom(DatagramSocket dSock) {
  187. try {
  188. // DatagramSocket dSock = new DatagramSocket(PORT);
  189. byte[] recvBuf = new byte[5000];
  190. DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
  191. dSock.receive(packet);
  192. int byteCount = packet.getLength();
  193. ByteArrayInputStream byteStream = new ByteArrayInputStream(recvBuf);
  194. ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream));
  195. Object o = is.readObject();
  196. is.close();
  197. return (o);
  198. } catch (IOException e) {
  199. System.err.println("Exception: " + e);
  200. e.printStackTrace();
  201. } catch (ClassNotFoundException e) {
  202. e.printStackTrace();
  203. }
  204. return (null);
  205. }
  206.  
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement