//Runs concurrently with Handler class, parses PlayerModelProto.PlayerModel object from FileInputStream package com.hearthattack; import com.protos.PlayerModelProto; import com.protos.BoardModelProto; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.atomic.AtomicBoolean; import java.lang.Runnable; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Reader implements Runnable { private PlayerModelProto.PlayerModel playerModel; private PlayerModelProto.PlayerModel opponentModel; private AtomicBoolean update; private AtomicBoolean terminate; private Lock write; private int portNumber; public Reader(PlayerModelProto.PlayerModel sharedPlayer, PlayerModelProto.PlayerModel sharedOpponent, AtomicBoolean sharedFlag, AtomicBoolean sharedTerm, ReentrantReadWriteLock rwLock, int port) { playerModel = sharedPlayer; opponentModel = sharedOpponent; update = sharedFlag; terminate = sharedTerm; write = rwLock.writeLock(); portNumber = port; } public void run() { try { ServerSocket serverSocket = new ServerSocket(portNumber); Socket clientSocket = serverSocket.accept(); DataInputStream in = new DataInputStream(clientSocket.getInputStream()); while(!terminate.get()){ System.out.println("Waiting for message"); BoardModelProto.BoardModel boardModel = BoardModelProto.BoardModel.parseFrom(in); System.out.println("Received a message"); System.out.println(boardModel.toString()); playerModel = boardModel.getPlayer(); opponentModel = boardModel.getOpponent(); write.lock(); update.set(true); write.unlock(); System.out.println("Translated message"); } } catch (IOException e) { e.printStackTrace(); } } }