Advertisement
Guest User

szerver

a guest
Apr 23rd, 2017
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.13 KB | None | 0 0
  1. package domino;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileWriter;
  8. import java.io.IOException;
  9. import java.io.ObjectInputStream;
  10. import java.io.ObjectOutputStream;
  11. import java.net.ServerSocket;
  12. import java.net.Socket;
  13. import java.util.ArrayList;
  14. import java.util.HashMap;
  15. import java.util.Iterator;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.Scanner;
  19.  
  20. public class DominoServer {
  21. private static ServerSocket server;
  22.  
  23. public static void acceptClients(int clientNumber, String inFilename, String outFilename) {
  24. try {
  25. if (server == null) {
  26. server = new ServerSocket(60504);
  27. }
  28. List<Socket> clients = new ArrayList<>();
  29. for (int i = 0; i < clientNumber; ++i) {
  30. Socket s = server.accept();
  31. clients.add(s);
  32. }
  33. new Game(clients, inFilename, outFilename).start();
  34. } catch (Exception e) {
  35. System.err.println("Hiba a kliensek fogadasakor.");
  36. e.printStackTrace();
  37. }
  38. }
  39.  
  40. public static void main(String[] args) {
  41. try {
  42. int playersNumber;
  43. /*try {
  44.  
  45. int tempNumber = Integer.parseInt(args[0]); // játékosok száma
  46. if (2 <= tempNumber && tempNumber <=4) {
  47. playersNumber = tempNumber;
  48. } else {
  49. System.err.println("Nem megfelelo a jatekosok szama.");
  50. playersNumber = 2;
  51. }
  52. } catch (NumberFormatException e) {
  53. playersNumber = 2;
  54. }
  55. acceptClients(playersNumber,args[1],args[2]);*/
  56. acceptClients(3, "input1.txt", "tesztOutput.txt");
  57. } catch (Exception e) {
  58. System.err.println("Hiba a szerver inditasanal.");
  59. e.printStackTrace();
  60. }
  61. }
  62.  
  63. }
  64.  
  65. class Game extends Thread {
  66. Map<Integer, ObjectOutputStream> osMap;
  67. Map<Integer, ObjectInputStream> isMap;
  68. Map<Integer,Socket> sockets;
  69. List<Domino> talon;
  70. String filename;
  71. String outputFileName;
  72. Integer lastDomino = null;
  73. int firstEmptyIndex = 0;
  74. Map<Integer,String> players;
  75. private boolean stop = false;
  76.  
  77. public Game(List<Socket> clients, String filename, String outFilename) throws IOException {
  78. Integer i = 0;
  79. osMap = new HashMap<>();
  80. isMap = new HashMap<>();
  81. players = new HashMap<>();
  82. sockets = new HashMap<>();
  83. this.outputFileName = outFilename;
  84. this.filename = filename;
  85. for (Socket s : clients) {
  86. ++i;
  87. sockets.put(i,s);
  88. osMap.put(i, new ObjectOutputStream(s.getOutputStream()));
  89. isMap.put(i, new ObjectInputStream(s.getInputStream()));
  90.  
  91. }
  92.  
  93. }
  94.  
  95. public boolean handleClients(Map<Integer, ObjectOutputStream> osMap, Map<Integer, ObjectInputStream> isMap,
  96. String outputFileName, BufferedWriter writer) throws IOException {
  97.  
  98. try {
  99. boolean isAnswer = false;
  100. int newRequests = 0;
  101. for (Integer ind : osMap.keySet()) {
  102. if(!stop){
  103.  
  104.  
  105. System.out.println(ind + ". clienttől akarok olvasni");
  106. StringBuilder line = new StringBuilder();
  107. Object obj = isMap.get(ind).readObject();
  108.  
  109. line.append(players.get(ind)).append(" : ");
  110. if (obj instanceof String && ((String) obj).equals("NYERTEM")) {
  111. line.append(obj.toString());
  112. handleIfPlayerWins(osMap, ind);
  113. }
  114. if (obj instanceof String && ((String) obj).equals("UJ")) {
  115. line.append(obj.toString());
  116. newRequests++;
  117. isAnswer = true;
  118. handleIfTalonIsEmpty(osMap, newRequests, ind,writer);
  119. handleIfTalonIsNotEmpty(osMap, ind);
  120.  
  121. if (!isAnswer && talon.isEmpty()) {
  122. osMap.get(ind).writeObject(new String("VEGE"));
  123. stop = true;
  124. }
  125. }
  126.  
  127. if (obj instanceof Integer) {
  128. line.append(obj.toString());
  129. isAnswer = true;
  130. lastDomino = (Integer) obj;
  131. if (ind == osMap.size()) {
  132. osMap.get(1).writeObject(obj);
  133. } else {
  134. osMap.get(ind + 1).writeObject(obj);
  135. }
  136. }
  137. //if (!stop) {
  138. writer.write(line.toString() + "\n");
  139. writer.newLine();
  140. System.out.println(line.toString());
  141. //}
  142.  
  143. }
  144.  
  145. stopServer(osMap, isAnswer);
  146. }
  147. } catch (IOException | ClassNotFoundException e) {
  148. e.printStackTrace();
  149. }
  150. return true;
  151. }
  152.  
  153. private void stopServer(Map<Integer, ObjectOutputStream> osMap, boolean isAnswer) throws IOException {
  154. if (!isAnswer) {
  155. for (Integer ind : osMap.keySet()) {
  156. osMap.get(ind).writeObject(new String("VEGE"));
  157. }
  158. stop = true;
  159. } else {
  160. isAnswer = false;
  161. }
  162. }
  163.  
  164. private void handleIfPlayerWins(Map<Integer, ObjectOutputStream> osMap, Integer ind) throws IOException {
  165.  
  166. for (Integer ind2 : osMap.keySet()) {
  167. if (ind != ind2) {
  168. osMap.get(ind2).writeObject(new String("VEGE"));
  169. }
  170. }
  171. stop = true;
  172. }
  173.  
  174. private void handleIfTalonIsNotEmpty(Map<Integer, ObjectOutputStream> osMap, Integer ind) throws IOException {
  175. if (!talon.isEmpty()) {
  176. osMap.get(ind).writeObject(talon.get(0));
  177. if (ind == osMap.size()) {
  178. osMap.get(1).writeObject(lastDomino);
  179. } else {
  180. osMap.get(ind + 1).writeObject(lastDomino);
  181. }
  182. talon.remove(talon.get(0));
  183. }
  184. }
  185.  
  186. private void handleIfTalonIsEmpty(Map<Integer, ObjectOutputStream> osMap, int newRequests, Integer ind,BufferedWriter writer)
  187. throws IOException {
  188. if (talon.isEmpty()) {
  189. osMap.get(ind).writeObject(new String("NINCS"));
  190. if (newRequests == osMap.size()) {
  191. for (Integer number : osMap.keySet()) {
  192. osMap.get(number).writeObject(new String("VEGE"));
  193.  
  194. }
  195. writer.write("DONTETLEN");
  196. System.out.println("DONTETLEN");
  197. stop = true;
  198. } else {
  199. if (ind == osMap.size()) {
  200. osMap.get(1).writeObject(lastDomino);
  201.  
  202. } else {
  203. osMap.get(ind + 1).writeObject(lastDomino);
  204. }
  205.  
  206. }
  207.  
  208. }
  209. }
  210.  
  211. @Override
  212. public void run() {
  213. try (BufferedWriter bw = new BufferedWriter(new FileWriter(outputFileName))) {
  214. readFromFile(filename);
  215.  
  216. for(Integer ind : isMap.keySet()){
  217. String name = (String) isMap.get(ind).readObject();
  218. players.put(ind, name);
  219. }
  220. divideDominos();
  221. String start = "START";
  222. osMap.get(1).writeObject(start);
  223. while (!stop) {
  224. handleClients(osMap, isMap, outputFileName, bw);
  225. }
  226. } catch (Exception e) {
  227. e.printStackTrace();
  228. }
  229.  
  230. }
  231.  
  232. private void readFromFile(String filename) throws FileNotFoundException {
  233. FileInputStream fis = new FileInputStream(new File(filename));
  234. Scanner sc = new Scanner(fis);
  235. talon = new ArrayList<>();
  236.  
  237. while (sc.hasNext()) {
  238. String[] array = sc.nextLine().split("\\s+");
  239. talon.add(new Domino(Integer.parseInt(array[0]), Integer.parseInt(array[1])));
  240. }
  241. sc.close();
  242. }
  243.  
  244. private void divideDominos() throws IOException {
  245. for (Integer key : osMap.keySet()) {
  246. int counter = 0;
  247. Iterator<Domino> iter = talon.iterator();
  248. while (iter.hasNext() && counter < 7) {
  249. osMap.get(key).writeObject(iter.next());
  250. iter.remove();
  251. ++counter;
  252. }
  253.  
  254. }
  255. }
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement