Coverage Summary for Class: CLI (it.polimi.ingsw.Client.CLI)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
CLI |
0%
(0/1)
|
0%
(0/5)
|
0%
(0/26)
|
0%
(0/46)
|
1 package it.polimi.ingsw.Client.CLI;
2
3
4 import it.polimi.ingsw.Network.KeepAliveSocketWrapper;
5 import it.polimi.ingsw.Network.SocketWrapper;
6
7 import java.io.BufferedReader;
8 import java.io.IOException;
9 import java.io.InputStreamReader;
10 import java.net.ConnectException;
11 import java.net.Socket;
12 import java.util.Arrays;
13 import java.util.concurrent.CyclicBarrier;
14
15 /**
16 * This class runs game's cli version and to do that it initializes client's view and runs 2 different threads:
17 * One for writing elements on CLI and send message to Server (CliWriter class)
18 * One for receiving responses from Server and update Client's view (ClientReader class)
19 */
20 public class CLI implements Runnable {
21 /**
22 * Run Thread responsible for asking User which server wants to connect to
23 */
24 public void run() {
25 //Create and Initialize BufferedReader
26 BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
27 Socket connection;
28 try {
29 System.out.println("Type server's ip address");
30 String ipAddress;
31 boolean validate;
32 do {
33 ipAddress = stdIn.readLine(); //get input from stdIn
34 validate = isIp(ipAddress); //check if is a valid ip address
35 if (!validate) System.out.println("Ip address not valid");
36 else break;
37 //repeat until the user types a valid ip address
38 } while (true);
39 System.out.println("Type server's port");
40 int port;
41 do {
42 while (true) {
43 try {
44 //get input from stdIN
45 String portString = stdIn.readLine();
46 if (portString == null)
47 throw new IOException();
48 //get int value from int
49 port = Integer.parseInt(portString);
50 break;
51 } catch (NumberFormatException ex) {
52 System.out.println("This string is not a number, retry.");
53 }
54 //repeat until the user types a number
55 }
56 if (port < 1024 || port > 65535) System.out.println("Port number not valid, try again");
57 else break;
58 //repeat until the user types a valid port number
59 } while (true);
60
61 try {
62 //try to open connection with given parameters
63 connection = new Socket(ipAddress, port);
64 } catch (ConnectException connectException) {
65 System.out.println("No server listening in this socket, quitting the game...");
66 return;
67 }
68 //create and initialize SocketWrapper
69 SocketWrapper socketWrapper = new KeepAliveSocketWrapper(connection, 5000, true);
70 OpenCLI(socketWrapper, stdIn);
71 } catch (Exception e) {
72 e.printStackTrace();
73 }
74 }
75
76 /**
77 * used to verify that the string entered by the user is an ip address
78 *
79 * @param string String typed by user
80 * @return true if the string is a valid ip address, false otherwise
81 */
82 private boolean isIp(String string) {
83 //divided string in parts using '\\' as limiter
84 String[] parts = string.split("\\.", -1);
85 return parts.length == 4 // 4 parts
86 && Arrays.stream(parts)
87 .filter(this::isDecimal) // Only decimal numbers
88 .map(Integer::parseInt)
89 .filter(i -> i <= 255 && i >= 0) // Must be inside [0, 255]
90 .count() == 4; // 4 numerical parts inside [0, 255]
91 }
92
93 /**
94 * Support method to initialize CliWriter and ClientReader threads, it also creates and initialize Client's view
95 *
96 * @param socket SocketWrapper used to wrap the socket used from Client and Server
97 * @param bufferedReader BufferedReader used to acquire ip address and port number will be used to acquire commands during the game
98 */
99 private static void OpenCLI(SocketWrapper socket, BufferedReader bufferedReader) {
100 //initialize cyclic barrier shared by CliWriter and CliReader
101 CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
102 //initialize Client's view
103 ClientView clientView = new ClientView();
104 //initialize cliWriter
105 CliWriter cliWriter = new CliWriter(socket, clientView, bufferedReader, cyclicBarrier);
106 //start cliWriter's thread
107 Thread writerThread = new Thread(cliWriter);
108 writerThread.start();
109 //initialize ClientReader
110 ClientReader ClientReader = new ClientReader(socket, clientView, cyclicBarrier);
111 //start ClientReader's thread
112 Thread readerThread = new Thread(ClientReader);
113 readerThread.start();
114
115 }
116
117 /**
118 * Check that a string represents a decimal number
119 *
120 * @param string The string to check
121 * @return true if string consists of only numbers without leading zeroes, false otherwise
122 */
123 private boolean isDecimal(String string) {
124 // Check whether string has a leading zero but is not "0"
125 if (string.startsWith("0")) {
126 return string.length() == 1;
127 }
128 for (char c : string.toCharArray()) {
129 if (c < '0' || c > '9') {
130 return false;
131 }
132 }
133 return true;
134 }
135 }