Coverage Summary for Class: SocketWrapper (it.polimi.ingsw.Network)

Class Class, % Method, % Branch, % Line, %
SocketWrapper 0% (0/1) 0% (0/6) 0% (0/2) 0% (0/21)


1 package it.polimi.ingsw.Network; 2  3 import it.polimi.ingsw.Logger; 4 import it.polimi.ingsw.Server.Messages.Message; 5  6 import java.io.IOException; 7 import java.io.ObjectInputStream; 8 import java.io.ObjectOutputStream; 9 import java.net.InetAddress; 10 import java.net.Socket; 11 import java.net.SocketException; 12 import java.util.Objects; 13  14 /** 15  * Wrapper around a {@link Socket} transfering {@link Message}s, removes most of the overhead of handling the connection. 16  */ 17 public class SocketWrapper { 18  private final Socket sock; 19  private final ObjectInputStream input; 20  private final ObjectOutputStream output; 21  22  /** 23  * Create the SocketWrapper around a standard socket 24  * 25  * @param socket the socket to wrap around 26  * @throws IOException if the socket/wrapper has issues opening its streams 27  */ 28  public SocketWrapper(Socket socket) throws IOException { 29  this.sock = socket; 30  // get output writer 31  this.output = new ObjectOutputStream(this.sock.getOutputStream()); 32  // get the input reader 33  this.input = new ObjectInputStream(socket.getInputStream()); 34  } 35  36  /** 37  * Blocks until a message is read 38  * 39  * @return the read {@link Message} 40  * @throws SocketException if there's an error while reading from the object stream, the socket will close and this exception 41  * is thrown 42  */ 43  public Message awaitMessage() throws IOException { 44  try { 45  return (Message) input.readObject(); 46  } catch (Exception e) { 47  Logger.info("the object stream from socket generated an exception and the SocketWrapper will now be closed." + 48  "The exception was: " + e.getClass()); 49  this.close(); 50  Logger.info("closed SocketWrapper"); 51  throw new SocketException("SocketWrapper is closed"); 52  } 53  } 54  55  /** 56  * Attempts to close the socket, if the socket is already closed then it does nothing 57  * 58  * @throws IOException if any exception happens during closing of the socket 59  */ 60  public void close() throws IOException { 61  if (!this.sock.isClosed()) { 62  this.input.close(); 63  this.output.flush(); 64  this.output.close(); 65  this.sock.close(); 66  } 67  } 68  69  /** 70  * Check to see if the socket is closed 71  * 72  * @return true if the socket is closed 73  */ 74  public boolean isClosed() { 75  return sock.isClosed(); 76  } 77  78  /** 79  * Sends a message to the socket endpoint 80  * 81  * @param message the message to send, required not null 82  * @throws IOException if any error happens during the sending of the message 83  */ 84  public synchronized void sendMessage(Message message) throws IOException { 85  Objects.requireNonNull(message); 86  this.output.writeObject(message); 87  this.output.flush(); 88  } 89  90  /** 91  * Get the address this socket is bound to 92  * 93  * @return the address this socket is connected to. 94  */ 95  public InetAddress getInetAddress() { 96  return sock.getInetAddress(); 97  } 98 }