Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.65 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Net;
  8. using System.Net.Sockets;
  9.  
  10. namespace server
  11. {
  12.     class programm
  13.     {
  14.         static int[,] g = new int[5, 5];              //граф остановок в элементе g[i,j] хранится расстояние от i до j в графе остановок
  15.         static float cst = 0.5F;                        //цена за единицу пути
  16.         static float v = 1;                             //средняя скорость автобуса
  17.         static int client_port = 8048;                  //порнт на который приходят соединения клиента
  18.         static int bus_port = 8049;                     //порт на который приходят соежинения автобусов
  19.         static string adress = "127.0.0.1";
  20.         static string path = @"C:\Users\Кирилл\source\repos\str_bus\str_bus\graph.txt";
  21.         static void Main()
  22.         {
  23.             read_graph();
  24.             IPEndPoint client_ipPoint = new IPEndPoint(IPAddress.Parse(adress), client_port);
  25.             IPEndPoint bus_ipPoint = new IPEndPoint(IPAddress.Parse(adress), bus_port);
  26.  
  27.             Socket bus_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  28.             Socket client_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  29.             try
  30.             {
  31.                 bus_sock.Bind(bus_ipPoint);
  32.                 bus_sock.Listen(1);
  33.                 client_sock.Bind(client_ipPoint);
  34.                 client_sock.Listen(1);
  35.                 Console.WriteLine("Включен режим прослушивания");
  36.  
  37.                 List<Bus> buses = new List<Bus>();
  38.  
  39.                 while (true)
  40.                 {
  41.                     foreach (Bus bus in buses)
  42.                     {
  43.                         bus.update_loc();               //Обновление местоположения уже работающих автобусов
  44.                         Console.WriteLine("Местоположение автобусов обновленно");
  45.                     }
  46.                     if (bus_sock.Poll(0, SelectMode.SelectRead))
  47.                     {
  48.                         buses.Add(new Bus(bus_sock.Accept()));          //добавление к списку ещё одного активного автобуса
  49.                         Console.WriteLine("Добавлен новый автобус");
  50.                     }
  51.                     Pasanger pas = new Pasanger(client_sock.Accept());  //приём запроса пассажира
  52.                     Console.WriteLine("Добавлен новый пассажир");
  53.                     Bus b = new Bus();
  54.                     Pair v = check_dist(b, buses, pas);                 //Расчет наилучшего автобуса и вершин в пути автобуса от которых будет проложен путь к start и finish
  55.  
  56.                     if (b != null)
  57.                     {
  58.                         Console.WriteLine("Найилучший автобус найден");
  59.                         Answer ans = new Answer();
  60.                         vector way = b.change_way(pas, v);     //Изменение пути для пассажира
  61.                         Console.WriteLine("Изменение пути расчитано");
  62.                         int S = calc_dist(way, pas.od);     //Рассчет расстояния между вершинами start и finish
  63.                         ans.coast = calc_coast(S);          //Рассчет стоймости поездки
  64.                         ans.time = calc_coast(S);
  65.                         ans.time = calc_time(S);
  66.                         ans.number = b.number;
  67.                         ans.flag = true;
  68.                         pas.send_data(ans);                 //Отправки данных пассажиру
  69.                         Console.WriteLine("Запрос подтверждения от пассажира");
  70.                         if (pas.conf())                     //Ожидание ответа пассажира
  71.                         {
  72.                             Console.WriteLine("Подтверждение получено");
  73.                             b.Way = way;
  74.                             b.send_way();                   //Отправка новго пути автобусу
  75.                         }
  76.                     }
  77.                     else
  78.                     {
  79.                         Console.WriteLine("Автобус не найден");
  80.                         Answer ans = new Answer();
  81.                         ans.flag = false;
  82.                         pas.send_data(ans);
  83.                     }
  84.                 }
  85.             }
  86.             catch(Exception ex)
  87.             {
  88.                 Console.WriteLine(ex.Message);
  89.             }
  90.         }
  91.         struct Answer
  92.         {
  93.             public bool flag;                   //положительный/отрицательный ответ
  94.             public string number;               //регистрационный номер автобуса
  95.             public float coast;                 //цена поездки
  96.             public float time;                  //время поездки
  97.             public List<int> way;               //Путь
  98.         }                                //Структура ответа сервера
  99.         struct Location
  100.         {
  101.             public int pos;
  102.             /*float x;
  103.             float y;*/
  104.         }                              //структура местоположения            
  105.         struct Pair
  106.         {
  107.             public int start;
  108.             public int finish;
  109.         }                                  //структура начала и конца пути
  110.  
  111.         class vector
  112.         {
  113.             int[] values;
  114.             public int size;
  115.  
  116.             public vector()
  117.             {
  118.                 values = new int[30];
  119.                 size = 0;
  120.             }
  121.             public void Add(int val)
  122.             {
  123.                 values[size++] = val;
  124.             }
  125.             public void Del(int index)
  126.             {
  127.                 for (int i = index + 1; i < size; i++)
  128.                     values[i - 1] = values[i];
  129.                 size--;
  130.             }
  131.             public int this[int index]
  132.             {
  133.                 get { return values[index]; }
  134.                 set { values[index] = value; }
  135.             }
  136.         }
  137.         class Bus
  138.         {
  139.             public string number;                          //Регистрационный номер автобуса
  140.             Location loc;                                  //Текущее местоположегние автобуса
  141.             int num_pasn;                                  //Кол-во пасажиров в автобусе
  142.             public vector way;                                    //Текущий путь автобуса
  143.             bool active;                                   //флаг состояния автобуса
  144.             Socket socket;                                 //дискриптор сокета автобуса
  145.  
  146.             private void recv()
  147.             {
  148.                 StringBuilder dat = new StringBuilder();
  149.                 byte[] buff = new byte[256];
  150.                 int bytes = 0;
  151.  
  152.                 do
  153.                 {
  154.                     bytes = socket.Receive(buff);
  155.                     dat.Append(Encoding.Unicode.GetString(buff, 0, bytes));
  156.                 } while (socket.Available > 0);
  157.                 int i = 0;
  158.                 while (dat[i] != ' ')
  159.                     number += dat[i++];
  160.                 string pos = "";
  161.                 i++;
  162.                 for (; i < dat.Length; i++)
  163.                     pos += dat[i];
  164.                 loc.pos = Convert.ToInt32(pos);
  165.             }
  166.             public vector Way
  167.             {
  168.                 set
  169.                 {
  170.                     way = value;
  171.                 }
  172.             }                           //свойство обновляющие way
  173.             public Bus()
  174.             {
  175.                 active = false;
  176.                 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  177.             }
  178.             public Bus(Socket sock)
  179.             {
  180.                 loc = new Location();
  181.                 num_pasn = 0;
  182.                 way = new vector();
  183.                 active = true;
  184.                 socket = sock;
  185.                 recv();
  186.             }                     //Конструктор устанавливающий дискриптор и номер автобуса
  187.             public vector change_way(Pasanger ps,Pair v)
  188.             {
  189.                 int ds;
  190.                 vector res = new vector();
  191.                 for (int i = 0; i < way.size; i++)
  192.                 {
  193.                     if (way[i] == v.start)
  194.                     {
  195.                         res.Add(v.start);
  196.                         res.Add(ps.od.start);
  197.                     }
  198.                     else if(way[i] == v.finish)
  199.                     {
  200.                         res.Add(v.finish);
  201.                         res.Add(ps.od.finish);
  202.                     }
  203.                     else res.Add(way[i]);
  204.                 }
  205.                 return res;
  206.             }       //Возвращает текущий путь оптимально дополненый вершинами ps.start и ps.finish
  207.             public void update_loc()
  208.             {
  209.                 string message = "g";
  210.                 socket.Send(Encoding.Unicode.GetBytes(message));
  211.                 byte[] buff = new byte[256];
  212.                 int bytes = socket.Receive(buff);
  213.                 loc.pos = Convert.ToInt32(Encoding.Unicode.GetString(buff, 0, bytes));
  214.             }                  //обновляет место положение автобуса
  215.             public void send_way()
  216.             {
  217.                 num_pasn++;
  218.                 string w = "";
  219.                 for (int i = 0; i < way.size; i++)
  220.                     w += Convert.ToString(way[i]) + " ";
  221.                 socket.Send(Encoding.Unicode.GetBytes(w));
  222.             }
  223.         }
  224.         class Pasanger
  225.         {
  226.             public Pair od;                            //информауия о начале и конце пути
  227.             Socket socket;                             //сокет через который происходит обмен данными
  228.             public Pasanger(Socket sock)               //конструктор получающий сокет из прослушающего сокета listener
  229.             {
  230.                 socket = sock;              //Получение сокета из очереди
  231.                 StringBuilder date = new StringBuilder();
  232.                 recv(date);                             //считываение переданных данных
  233.                 wr_date(date);                          //записывает данные в поля объекта
  234.             }
  235.             public void send_data(Answer ans)
  236.             {
  237.                 String message = "";
  238.  
  239.                 message += ans.flag ? "1" : "0" + " ";
  240.                 message += ans.coast.ToString() + " ";
  241.                 message += ans.time.ToString() + " ";
  242.                 message += ans.number + " ";
  243.  
  244.                 foreach (int p in ans.way)
  245.                     message += p.ToString() + " ";
  246.  
  247.                 byte[] data = new byte[256];
  248.                 data = Encoding.Unicode.GetBytes(message);
  249.                 socket.Send(data);
  250.             }       //преобразует данные из ans в строку и отправляет её клиенту
  251.             public bool conf()
  252.             {
  253.                 StringBuilder ans = new StringBuilder();
  254.                 recv(ans);          //отправляет ans клиенту
  255.                 return ans.ToString() == "1" ? true : false;
  256.             }                      //Получение подтвекрждение от клиента
  257.             private void recv(StringBuilder data)
  258.             {
  259.                 int bytes = 0;
  260.                 byte[] buf = new byte[256];
  261.  
  262.                 do
  263.                 {
  264.                     bytes = socket.Receive(buf);
  265.                     data.Append(UnicodeEncoding.Unicode.GetString(buf, 0, bytes));
  266.                 } while (socket.Available > 0);
  267.  
  268.                 Console.WriteLine(data.ToString());
  269.             }   //считывание данных полученных через pasanger.socket
  270.             private void wr_date(StringBuilder date)
  271.             {
  272.                 String st = "";
  273.                 String fin = "";
  274.  
  275.                 int i = 0;
  276.                 while (date[i] != ' ')
  277.                     st += date[i++];
  278.                 i++;
  279.                 for (; i < date.Length; i++)
  280.                     fin += date[i];
  281.  
  282.                 od.start = Convert.ToInt32(st);
  283.                 od.finish = Convert.ToInt32(fin);
  284.             }//Преобразует строку StringBuilder в два числа и записывает их в поля объекта
  285.         }
  286.  
  287.         static void read_graph()
  288.         {
  289.             using (StreamReader st = new StreamReader(path, System.Text.Encoding.Default))
  290.             {
  291.                 string line;
  292.                 while ((line = st.ReadLine()) != null)
  293.                 {
  294.                     int i = 0;
  295.                     int u = get_int(line, ref i);
  296.                     int v = get_int(line, ref i);
  297.                     g[u, v] = get_int(line, ref i);
  298.                 }
  299.             }
  300.         }
  301.         static int get_int(string str, ref int pos)
  302.         {
  303.             string res = "";
  304.             while (str[pos] != ' ')
  305.                 res += str[pos++];
  306.             pos++;
  307.             return Convert.ToInt32(res);
  308.         }
  309.         static Pair check_dist(Bus b, List<Bus> buses, Pasanger ps)
  310.         {
  311.             int min = 1000000000;
  312.             Pair res = new Pair { start = -1, finish = -1 };
  313.             foreach (Bus bs in buses)
  314.             {
  315.                 Pair v = new Pair();
  316.                 int dist = find_dist(bs.way, ps.od, v);                         //Расчет минимального отклонения от маршрута для текущего автобуса и вершин start и finish
  317.                 //Pair v = bs.near_point(ps.od.start, out dist);
  318.  
  319.                 if (dist < min)
  320.                 {
  321.                     min = dist;
  322.                     b = bs;
  323.                     res = v;
  324.                 }
  325.             }
  326.             return res;
  327.         }       //ищет ближайший к пасажиру Ps автобус в списке buses
  328.         static int find_dist(vector way, Pair ps, Pair prs)
  329.         {
  330.             bool flag = false;
  331.             int res = (int)1e9;
  332.             for (int i = 0; i < way.size; i++)
  333.             {
  334.                 if ((g[way[i], ps.start] + g[ps.start, ps.finish] + g[ps.finish, way[i + 1]]) < res)
  335.                 {
  336.                     res = g[way[i], ps.start] + g[ps.start, ps.finish] + g[ps.finish, way[i + 1]];
  337.                     prs.start = way[i];
  338.                     prs.finish = way[i + 1];
  339.                 }
  340.                 else if ((res - g[ps.start, ps.finish] + g[ps.start, prs.start] + g[way[i], ps.finish] + g[ps.finish, way[i + 1]]) < res)
  341.                 {
  342.                     res = res - g[ps.start, ps.finish] + g[ps.start, prs.start] + g[way[i], ps.finish] + g[ps.finish, way[i + 1]];
  343.                     prs.finish = way[i];
  344.                 }
  345.             }
  346.             return res;
  347.         }               //возвращает расстояние между ps.start и ps.finish в way
  348.         static float calc_coast(int S)
  349.         {
  350.             return S * cst;
  351.         }                                    //возвращает цену пути S
  352.         static float calc_time(int S)
  353.         {
  354.             return S / v;
  355.         }                                     //возвращает время пути длины S
  356.         static int calc_dist(vector way, Pair ps)
  357.         {
  358.             int i = 0;
  359.             while (way[i] != ps.start)
  360.                 i++;
  361.             int res = 0;
  362.             while (way[i] != ps.finish)
  363.             {
  364.                 res += g[way[i], way[i + 1]];
  365.                 i++;
  366.             }
  367.             return res;
  368.         }
  369.     }
  370. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement