Advertisement
Guest User

Untitled

a guest
Apr 21st, 2014
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.28 KB | None | 0 0
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.text.DateFormat;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Arrays;
  8. import java.util.Date;
  9.  
  10. public class Server {
  11.  
  12. public static final int MAXIMUM_DATAGRAM_SIZE = 255; // Maximum size of datagram
  13. public static final String ECS = "End_of_Communication"; // End Communication String
  14.  
  15. public static void main(String[] args) throws IOException {
  16.  
  17. byte[] clientData1 = new byte[MAXIMUM_DATAGRAM_SIZE]; // Buffer for first client requesting to connect
  18. byte[] clientData2 = new byte[MAXIMUM_DATAGRAM_SIZE]; // Buffer for second client requesting to connect
  19. DatagramPacket clientPacket1 = new DatagramPacket(clientData1, clientData1.length); // Packet for first client requesting to connect
  20. DatagramPacket clientPacket2 = new DatagramPacket(clientData2, clientData2.length); // Packet for second client requesting to connect
  21. DatagramSocket serverSocket; // Socket for server to listen on
  22. int serverPort; // Port to start serverSocket on
  23. int clientPort1;
  24. int clientPort2;
  25. Runnable clientRun1; // Runnable object for first client requesting to connect
  26. Runnable clientRun2; // Runnable object for second client requesting to connect
  27. Thread clientThread1; // Thread for first client requesting to connect
  28. Thread clientThread2; // Thread for second client requesting to connect
  29. String clientAlias1; // Alias of first client requesting to connect
  30. String clientAlias2; // Alias of second client requesting to connect
  31.  
  32. // Check for correct # of arguments
  33. if(args.length != 1)
  34. throw new IllegalArgumentException("Parameter(s): <Port>");
  35.  
  36. // Initialize serverPort and serverSocket
  37. serverPort = Integer.parseInt(args[0]);
  38. serverSocket = new DatagramSocket(serverPort);
  39.  
  40. // Loop forever and accept requests from clients
  41. while(true) {
  42.  
  43. // Block until a client request is received, and get client alias and
  44. System.out.println("[" + getTime() + "] | Listening for client requests... |");
  45. serverSocket.receive(clientPacket1);
  46. clientAlias1 = new String(clientPacket1.getData());
  47. clientPort1 = clientPacket1.getPort();
  48. System.out.println("[" + getTime() + "] | Connected to first client <" + clientAlias1
  49. + "> with socket address [" + clientPacket1.getSocketAddress() + "] |");
  50.  
  51. // Block until a second client request is received, and get its alias
  52. serverSocket.receive(clientPacket2);
  53. clientAlias2 = new String(clientPacket2.getData());
  54. clientPort2 = clientPacket2.getPort();
  55. System.out.println("[" + getTime() + "] | Connected to second client <" + clientAlias2
  56. + "> with socket address [" + clientPacket2.getSocketAddress() + "] |");
  57.  
  58. // Send clientAlias2 to first client
  59. clientData2 = clientAlias2.getBytes();
  60. clientPacket1.setData(clientData2);
  61. serverSocket.send(clientPacket1);
  62. // Send clientAlias1 to second client
  63. clientData1 = clientAlias1.getBytes();
  64. clientPacket2.setData(clientData1);
  65. serverSocket.send(clientPacket2);
  66.  
  67. // Send second client's port to first client
  68. clientData2 = String.valueOf(clientPort2).getBytes();
  69. clientPacket1.setData(clientData2);
  70. serverSocket.send(clientPacket1);
  71.  
  72. clientData1 = String.valueOf(clientPort1).getBytes();
  73. clientPacket2.setData(clientData1);
  74. serverSocket.send(clientPacket2);
  75.  
  76. // Create a new thread for each client request received
  77. clientRun1 = new ServerThread(serverSocket, clientPacket1, clientPacket2, clientAlias1);
  78. clientThread1 = new Thread(clientRun1);
  79. clientRun2 = new ServerThread(serverSocket, clientPacket2, clientPacket1, clientAlias2);
  80. clientThread2 = new Thread(clientRun2);
  81.  
  82. // Start each thread
  83. clientThread1.start();
  84. clientThread2.start();
  85.  
  86. // Wait for threads to finish before looping again
  87. try{
  88. clientThread1.join();
  89. clientThread2.join();
  90. } catch(InterruptedException interrupt) {
  91. System.out.println("InterruptedException: " + interrupt);
  92. }// End try/catch block
  93.  
  94. }// End while loop
  95. }// End main
  96.  
  97. private static String getTime() {
  98. DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
  99. Date date = new Date();
  100. return dateFormat.format(date);
  101. }
  102.  
  103. }// End Server
  104.  
  105. /*************************************End Server**************************************/
  106. /*************************************************************************************/
  107. /*********************************Start ServerThread**********************************/
  108.  
  109. class ServerThread implements Runnable {
  110.  
  111. protected DatagramSocket socket;
  112. protected DatagramPacket readPacket;
  113. protected DatagramPacket writePacket;
  114. protected InetAddress readAddress;
  115. protected InetAddress writeAddress;
  116. protected int readPort;
  117. protected int writePort;
  118. protected String userName;
  119.  
  120. public ServerThread(DatagramSocket serverSocket, DatagramPacket readPacket, DatagramPacket writePacket, String userName) {
  121. this.socket = serverSocket;
  122. this.readPacket = readPacket;
  123. this.writePacket = writePacket;
  124. this.readAddress = readPacket.getAddress();
  125. this.writeAddress = writePacket.getAddress();
  126. this.readPort = readPacket.getPort();
  127. this.writePort = writePacket.getPort();
  128. this.userName = userName;
  129. }
  130.  
  131. public void run() {
  132. try {
  133. String message;
  134. byte[] readBytes = new byte[Server.MAXIMUM_DATAGRAM_SIZE];
  135. byte[] writeBytes = new byte[Server.MAXIMUM_DATAGRAM_SIZE];
  136.  
  137. while(true) {
  138.  
  139. // Create byte array to read data from packet into
  140. readBytes = new byte[Server.MAXIMUM_DATAGRAM_SIZE];
  141. readPacket = new DatagramPacket(readBytes, readBytes.length, readAddress, readPort);
  142.  
  143. // Block until packet is received, and extract its data
  144. socket.receive(readPacket);
  145. if(readPacket.getPort() == writePort)
  146. continue;
  147. message = new String(readPacket.getData());
  148. if(message.equals(Server.ECS))
  149. System.out.println("[" + getTime() + "] | <" + userName + "> has disconnected. |");
  150. readBytes = Arrays.copyOfRange(readPacket.getData(), readPacket.getOffset(), readPacket.getOffset()+readPacket.getLength());
  151.  
  152. // Create byte array to write extracted data to
  153. writeBytes = new byte[Server.MAXIMUM_DATAGRAM_SIZE];
  154. writeBytes = readBytes;
  155. writePacket = new DatagramPacket(writeBytes, writeBytes.length, writeAddress, writePort);
  156.  
  157. // Send the packet to its destination
  158. socket.send(writePacket);
  159.  
  160.  
  161. }
  162. } catch (IOException e) {
  163. // TODO Auto-generated catch block
  164. e.printStackTrace();
  165. }
  166.  
  167. }
  168.  
  169. private String getTime() {
  170. DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
  171. Date date = new Date();
  172. return dateFormat.format(date);
  173. }
  174.  
  175.  
  176. }
  177.  
  178. import java.net.DatagramSocket;
  179. import java.net.DatagramPacket;
  180. import java.net.InetAddress;
  181. import java.net.SocketException;
  182. import java.text.DateFormat;
  183. import java.text.SimpleDateFormat;
  184. import java.util.Date;
  185. import java.io.BufferedReader;
  186. import java.io.IOException;
  187. import java.io.InputStreamReader;
  188.  
  189. public class Client {
  190.  
  191. public static final int MAXIMUM_DATAGRAM_SIZE = 255; // Maximum size of datagram
  192. public static final String ECS = "End_of_Communication"; // End Communication String
  193.  
  194. public static void main(String[] args) throws IOException {
  195.  
  196. BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in)); // BufferedReader to get user input
  197. byte[] myData = new byte[MAXIMUM_DATAGRAM_SIZE];
  198. byte[] clientData = new byte[MAXIMUM_DATAGRAM_SIZE];
  199. DatagramSocket clientSocket; // Socket for this client to connect to server
  200. DatagramPacket myDataPacket;
  201. DatagramPacket clientDataPacket;
  202. InetAddress serverIP; // IP address of server
  203. int serverPort; // Port that server is listening on
  204. int clientPort; // Port to send messages to
  205. WriteThread write; // Thread to write data to the server
  206. ReadThread read; // Thread to read data from the server
  207. String userName; // Alias to use for this client
  208. String clientName; // Alias to use for other client
  209.  
  210. // Check for correct # of arguments
  211. if((args.length < 1) || (args.length > 2))
  212. throw new IllegalArgumentException("Parameter(s): <Server> [<Port>]");
  213.  
  214. // Create DatagramSocket on specified port and IP address
  215. serverIP = InetAddress.getByName(args[0]);
  216. serverPort = Integer.parseInt(args[1]);
  217. clientSocket = new DatagramSocket();
  218.  
  219. // Connect the socket the server
  220. clientSocket.connect(serverIP, serverPort);
  221.  
  222. // Collect data to connect
  223. System.out.println("Please enter username(No Spaces): [Guest]");
  224. userName = userInput.readLine();
  225. if(userName.isEmpty())
  226. userName = "Guest";
  227.  
  228. System.out.println("| Username set to <" + userName + ">. Sending to server... |");
  229. myData = userName.getBytes();
  230.  
  231. // Send packet with userName to server
  232. myDataPacket = new DatagramPacket(myData, myData.length, serverIP, serverPort);
  233. clientSocket.send(myDataPacket);
  234.  
  235. // Create packet to receive data about the other client from the server
  236. clientDataPacket = new DatagramPacket(clientData, clientData.length);
  237. clientDataPacket.setLength(MAXIMUM_DATAGRAM_SIZE);
  238. clientSocket.receive(clientDataPacket);
  239. clientName = new String(clientDataPacket.getData());
  240. clientData = new byte[MAXIMUM_DATAGRAM_SIZE];
  241. clientDataPacket = new DatagramPacket(clientData, clientData.length);
  242. clientDataPacket.setLength(MAXIMUM_DATAGRAM_SIZE);
  243. clientSocket.receive(clientDataPacket);
  244. clientPort = Integer.parseInt((new String(clientDataPacket.getData())).trim());
  245.  
  246. // Create and start threads to write to and read data from the server
  247. write = new WriteThread(clientSocket, serverPort, userName);
  248. read = new ReadThread(clientSocket, clientName);
  249. write.start();
  250. read.start();
  251.  
  252. // Wait for threads to finish
  253. try {
  254. write.join();
  255. read.join();
  256. } catch(InterruptedException interrupt) {
  257. System.out.println("InterruptedException: " + interrupt);
  258. }// End try/catch block
  259.  
  260. }// End main
  261. }// End Client
  262.  
  263. /*************************************End Client**************************************/
  264. /*************************************************************************************/
  265. /**********************************Start WriteThread**********************************/
  266.  
  267. class WriteThread extends Thread implements Runnable {
  268.  
  269. protected InetAddress serverIP; // IP address of the server
  270. protected int serverPort; // Port server is listening on
  271. protected DatagramSocket writeSocket; // DatagramSocket to SEND data to server
  272. protected String userName;
  273.  
  274. public WriteThread(DatagramSocket clientSocket, int serverPort, String userName) {
  275. this.writeSocket = clientSocket;
  276. this.serverPort = serverPort;
  277. this.serverIP = clientSocket.getInetAddress();
  278. this.userName = userName;
  279. }
  280.  
  281. public void run() {
  282.  
  283. try {
  284. BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
  285. String writeString;
  286. byte[] writeBytes;
  287. DatagramPacket writePacket;
  288.  
  289. while(true) {
  290. writeBytes = new byte[Client.MAXIMUM_DATAGRAM_SIZE];
  291. writeString = userInput.readLine();
  292. writeBytes = writeString.getBytes();
  293. writePacket = new DatagramPacket(writeBytes, writeBytes.length, serverIP, serverPort);
  294. writeSocket.send(writePacket);
  295. if((writeString).equals(Client.ECS))
  296. break;
  297. System.out.println("[" + getTime() + "]<" + userName + "> " + new String(writePacket.getData()));
  298. }// End while
  299.  
  300. // End_of_Communiation received, print disconnect message
  301. System.out.println("[" + getTime() + "] | <" + userName + "> has disconnected. |");
  302. writeBytes = new byte[Client.MAXIMUM_DATAGRAM_SIZE];
  303. writeBytes = writeString.getBytes();
  304. writePacket = new DatagramPacket(writeBytes, writeBytes.length, serverIP, serverPort);
  305. writeSocket.send(writePacket);
  306.  
  307. } catch (IOException ex) {
  308. System.out.println("IOException: " + ex);
  309. }// End try/catch block
  310. }// End run()
  311.  
  312. private String getTime() {
  313. DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
  314. Date date = new Date();
  315. return dateFormat.format(date);
  316. }
  317.  
  318. }// End writeThread
  319.  
  320. /***********************************End WriteThread***********************************/
  321. /*************************************************************************************/
  322. /**********************************Start ReadThread***********************************/
  323.  
  324. class ReadThread extends Thread implements Runnable {
  325.  
  326. protected InetAddress serverIP; // IP address of the server
  327. protected int serverPort; // Port server is listening on
  328. protected DatagramSocket clientSocket; // DatagramSocket to READ data to server
  329. protected String clientName;
  330.  
  331. public ReadThread(DatagramSocket clientSocket, String clientName) throws SocketException {
  332. this.serverIP = clientSocket.getInetAddress();
  333. this.serverPort = clientSocket.getPort();
  334. this.clientSocket = clientSocket;
  335. this.clientName = clientName;
  336. }
  337.  
  338.  
  339. public void run() {
  340. try {
  341. byte[] readData = new byte[Server.MAXIMUM_DATAGRAM_SIZE]; // Buffer for data READ from server
  342. DatagramPacket readPacket; // Packet to READ data to server
  343. String readMessage; // String of the message READ from server
  344.  
  345. // Loop until user requests disconnect
  346. while(true) {
  347.  
  348.  
  349. // Set up datagram packet to READ from server
  350. readPacket = new DatagramPacket(readData, readData.length);
  351.  
  352. // Wait for a packet to READ from server
  353. clientSocket.receive(readPacket);
  354.  
  355. // Extract and print message READ from server
  356. readMessage = new String(readPacket.getData(), 0, readPacket.getLength());
  357. if(readMessage.equals(Client.ECS))
  358. break;
  359. System.out.println("[" + getTime() + "]<" + clientName + "> " + readMessage);
  360. }// End while
  361.  
  362. // End_of_Communication received, exit
  363. System.out.println("[" + getTime() + "] | <" + clientName + "> has disconnected. |");
  364.  
  365. } catch(IOException ex) {
  366. System.err.println("IOException caught: " + ex);
  367. }// End try/catch block
  368. return;
  369. }// End run
  370.  
  371. private String getTime() {
  372. DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
  373. Date date = new Date();
  374. return dateFormat.format(date);
  375. }
  376.  
  377. }// End readThread
  378.  
  379. try {
  380. // Loop until user requests disconnect
  381. while(true) {
  382. //...bla bla...
  383. }// End while
  384.  
  385. // End_of_Communication received, exit
  386. System.out.println("[" + getTime() + "] | <" + clientName + "> has disconnected. |");
  387.  
  388. } catch(IOException ex) {
  389. System.err.println("IOException caught: " + ex);
  390. } finally {
  391. // here we want to close the socket.
  392. //Even if an exception is thrown we always want to make sure that the client connection is terminated.
  393. clientSocket.close();
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement