Advertisement
Guest User

Untitled

a guest
Feb 18th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.22 KB | None | 0 0
  1. package com.server;
  2.  
  3. import java.io.*;
  4. import java.math.BigInteger;
  5. import java.net.InetSocketAddress;
  6. import java.security.MessageDigest;
  7. import java.security.NoSuchAlgorithmException;
  8. import java.util.Scanner;
  9.  
  10. import akka.actor.AbstractActor;
  11. import akka.actor.ActorRef;
  12. import akka.actor.ActorSystem;
  13. import akka.actor.Props;
  14. import akka.io.Tcp;
  15. import akka.io.Tcp.CommandFailed;
  16. import akka.io.Tcp.Connected;
  17. import akka.io.Tcp.ConnectionClosed;
  18. import akka.io.TcpMessage;
  19. import akka.util.ByteString;
  20. import org.jetbrains.annotations.NotNull;
  21.  
  22.  
  23. public class Client extends AbstractActor {
  24. private boolean entered = false;
  25.  
  26. static Props props(InetSocketAddress remote) {
  27. return Props.create(Client.class, remote);
  28. }
  29.  
  30. // Подключаемся к серверу
  31. public Client(InetSocketAddress remote) {
  32. final ActorRef tcp = Tcp.get(getContext().getSystem()).manager();
  33. tcp.tell(TcpMessage.connect(remote), getSelf());
  34. }
  35.  
  36.  
  37. static class UserInformation {
  38. final String userName;
  39. final String password;
  40. final char group;
  41. final char register;
  42.  
  43. UserInformation(String userName, String password, char group, char register) {
  44. this.userName = userName;
  45. this.password = password;
  46. this.group = group;
  47. this.register = register;
  48. }
  49.  
  50. ByteString getInformation() {
  51. return ByteString.fromString(String.format("%s %s %s %s", userName, md5Custom(password), group, register));
  52. }
  53.  
  54. @NotNull
  55. private static String md5Custom(String st) {
  56. byte[] digest = new byte[0];
  57. try {
  58. MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  59. messageDigest.reset();
  60. messageDigest.update(st.getBytes());
  61. digest = messageDigest.digest();
  62. } catch (NoSuchAlgorithmException e) {
  63. // тут можно обработать ошибку
  64. // возникает она если в передаваемый алгоритм в getInstance(,,,) не существует
  65. e.printStackTrace();
  66. }
  67.  
  68. BigInteger bigInt = new BigInteger(1, digest);
  69. StringBuilder md5Hex = new StringBuilder(bigInt.toString(16));
  70.  
  71. while( md5Hex.length() < 32 ){
  72. md5Hex.insert(0, "0");
  73. }
  74.  
  75. return md5Hex.toString();
  76. }
  77. }
  78.  
  79. @Override
  80. public Receive createReceive() {
  81. return receiveBuilder()
  82. .match(CommandFailed.class, msg -> {
  83. getContext().stop(getSelf());
  84.  
  85. })
  86. .match(Connected.class, msg -> {
  87. getSender().tell(TcpMessage.register(getSelf(), true, true), getSelf());
  88. getContext().become(connected(getSender()));
  89. })
  90. .build();
  91. }
  92.  
  93. private Receive connected(final ActorRef connection) {
  94. // System.out.println(connection);
  95. return receiveBuilder()
  96. .match(UserInformation.class, info -> {
  97.  
  98. connection.tell(TcpMessage.write(info.getInformation()),
  99. getSelf());
  100. entered = true;
  101. })
  102. .match(ByteString.class, msg -> {
  103. connection.tell(TcpMessage.write(msg), getSelf());
  104. })
  105. .match(CommandFailed.class, msg -> {
  106. System.out.println("Command Failed");
  107. })
  108. .matchEquals("close",msg -> {
  109. connection.tell(TcpMessage.close(), getSelf());
  110. })
  111. .match(TcpMessage.class, msg -> {
  112. getSender().tell(msg, getSelf());
  113. })
  114. .match(ConnectionClosed.class, msg -> {
  115. getContext().stop(getSelf());
  116. System.out.println("Server Closed");
  117. })
  118. .match(Tcp.Received.class, msg -> {
  119. byte[] byteArray = msg.data().toArray();
  120.  
  121. ServerInformation message;
  122. // Дессериализация класса
  123. try {
  124. ObjectInputStream objectInputStream = new ObjectInputStream(
  125. new ByteArrayInputStream(byteArray));
  126.  
  127. message = (ServerInformation) objectInputStream.readObject();
  128. objectInputStream.close();
  129. } catch (ClassCastException ex) {
  130. System.out.println("Wrong message from server");
  131. return;
  132. } catch (IOException ex) {
  133. System.out.println("Wrong class");
  134. return;
  135. }
  136.  
  137. System.out.println(message.getServerMessage());
  138. if(message.isEntered()) return;
  139.  
  140. if(!entered && message.isWrongName()) {
  141. System.out.println("This nickname already exists");
  142. return;
  143. }
  144. entered = true;
  145. System.out.println("You are logged in to your account");
  146.  
  147.  
  148.  
  149. })
  150. .build();
  151. }
  152.  
  153.  
  154.  
  155. }
  156. // Класс, для отправки информации о клиенте
  157. class MessageFromClient extends Message {
  158. Coordinates from;
  159. Coordinates to;
  160.  
  161. public MessageFromClient(Coordinates from, Coordinates to, double price, int minutes) {
  162. this.from = from;
  163. this.to = to;
  164. this.price = price;
  165. this.minutes = minutes;
  166. }
  167.  
  168. double price;
  169. int minutes;
  170.  
  171. static public MessageFromClient createMessage() {
  172. Scanner in = new Scanner(System.in);
  173.  
  174. System.out.println("Enter your location");
  175. Coordinates from = new MessageFromClient.Coordinates(in.nextDouble(), in.nextDouble());
  176.  
  177. System.out.println("Enter the place of arrival");
  178. Coordinates to = new MessageFromClient.Coordinates(in.nextDouble(), in.nextDouble());
  179.  
  180. System.out.println("Enter your price");
  181. double price = in.nextDouble();
  182.  
  183. System.out.println("Enter your waiting time");
  184. int waitingTime = in.nextInt();
  185.  
  186. return new MessageFromClient(from, to, price, waitingTime);
  187. }
  188.  
  189. @Override
  190. public String toString() {
  191. return "MessageFromClient{" +
  192. "from=" + from +
  193. ", to=" + to +
  194. ", price=" + price +
  195. ", minutes=" + minutes +
  196. '}';
  197. }
  198. }
  199.  
  200. class ClientMain {
  201. final static ActorSystem system = ActorSystem.create("System");
  202. final static ActorRef client = system.actorOf(Client.props(InetSocketAddress.createUnresolved(
  203. "localhost",8080)), "Client");
  204.  
  205.  
  206. public static void main(String[] args) throws IOException, InterruptedException {
  207. Thread.sleep(1000);
  208. client.tell(new Client.UserInformation("Anton", "123", 'd', 'n'), ActorRef.noSender());
  209.  
  210. ByteArrayOutputStream byteArrayOutputStream =
  211. new ByteArrayOutputStream();
  212. ObjectOutputStream objectOutputStream =
  213. new ObjectOutputStream(byteArrayOutputStream);
  214.  
  215. objectOutputStream.writeObject(MessageFromClient.createMessage());
  216. objectOutputStream.flush();
  217.  
  218. client.tell(ByteString.fromArray(byteArrayOutputStream.toByteArray()),
  219. ActorRef.noSender());
  220.  
  221. }
  222.  
  223. }
  224.  
  225. abstract class Message implements Serializable {
  226. static class Coordinates implements Serializable {
  227. Coordinates(double x, double y) {
  228. this.x = x;
  229. this.y = y;
  230. }
  231.  
  232.  
  233. double x;
  234. double y;
  235.  
  236. @Override
  237. public String toString() {
  238. return "Coordinates{" +
  239. "x=" + x +
  240. ", y=" + y +
  241. '}';
  242. }
  243. }
  244.  
  245. }
  246.  
  247. class ServerInformation implements Serializable {
  248. ServerInformation(boolean entered, String serverMessage, boolean wrongName) {
  249. this.entered = entered;
  250. this.serverMessage = serverMessage;
  251. this.wrongName = wrongName;
  252. }
  253.  
  254. private boolean entered;
  255. private String serverMessage;
  256. private boolean wrongName;
  257.  
  258. public void setEntered(boolean entered) {
  259. this.entered = entered;
  260. }
  261.  
  262. boolean isEntered() {
  263. return entered;
  264. }
  265.  
  266. String getServerMessage() {
  267. return serverMessage;
  268. }
  269.  
  270.  
  271. public void setWrongName(boolean wrongName) {
  272. this.wrongName = wrongName;
  273. }
  274.  
  275. boolean isWrongName() {
  276. return wrongName;
  277. }
  278.  
  279. byte[] serializeSelf() throws IOException {
  280. ByteArrayOutputStream byteArrayOutputStream =
  281. new ByteArrayOutputStream();
  282. ObjectOutputStream objectOutputStream =
  283. new ObjectOutputStream(byteArrayOutputStream);
  284.  
  285. objectOutputStream.writeObject(this);
  286. objectOutputStream.flush();
  287.  
  288. return byteArrayOutputStream.toByteArray();
  289. }
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement