Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Ярослав1488
3 / 2 / 3
Регистрация: 26.10.2015
Сообщений: 104
1

Подключение к запущенному серверу

30.05.2018, 09:21. Просмотров 80. Ответов 0
Метки нет (Все метки)

Здравствуйте! Помогите с такой ситуацией, у меня есть клиент серверное приложение, которое посылает друг другу сообщения. Приложение клиента запускает два сервера и они присылают клиенту в datagrid сообщение. А как сделать, чтобы можно было подключаться уже запущенному серверу, получить от него сообщения и отключиться от него?
код приложения сервер
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 class Program
    {
       
      
        static void Main(string[] args)
        {
                  
            try
            {
                
                SendMessageFromSocket(11000);
             
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
              
               Console.ReadLine();
            }
        }
        /// <summary>
        /// Отправить сообщение
        /// </summary>
        /// <param name="port">порт</param>
        static void SendMessageFromSocket(int port)
        {
            while(true)
            { 
            // Буфер для входящих данных
            byte[] bytes = new byte[1024];
            // Устанавливаем удаленную точку для сокета
            IPHostEntry ipHost = Dns.GetHostEntry("localhost");
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
            Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            // Соединяем сокет с удаленной точкой
           
                sender.Connect(ipEndPoint);
            
            //отправка сообщения
            Random rand = new Random();
            string message = Convert.ToString(rand.Next(0,3));
            Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString());
            byte[] msg = Encoding.UTF8.GetBytes(message);
            // Отправляем данные через сокет
            int bytesSent = sender.Send(msg);
            // Получаем ответ от сервера
            int bytesRec = sender.Receive(bytes);
            Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec));
               
            // Освобождаем сокет
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
           
                //sender.Dispose();
            }
        }
    }

Код для клиента

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 public void ProcedureForFirstServer(object ii)
        {
            Dictionary<int, string> pathFS = new Dictionary<int, string>();
            Dictionary<int, int> portDic = new Dictionary<int, int>();
                threadCount = dataGridView2.Rows.Count;
                Process proc = new Process();
                Socket handler;
                
                for(int t = 1;t<threadCount;t++)
                    {
                        pathFS.Add(t, Convert.ToString(dataGridView2.Rows[t-1].Cells[0].Value));
                    }
               var pathForServer =pathFS[(int)ii];
               var newPathForServer = pathForServer;
               var indexSlash = newPathForServer.LastIndexOf(@"\");
               newPathForServer = newPathForServer.Remove(0, indexSlash + 1);
               var indexExe = newPathForServer.IndexOf(".");
               newPathForServer = newPathForServer.Remove(indexExe);
               count++;
               diic.Add(count, newPathForServer);
 
              
                   for (int t = 1; t < threadCount; t++)
                   {
                       portDic.Add(t, Convert.ToInt32(dataGridView2.Rows[t - 1].Cells[1].Value));
                   }
                var port = portDic[(int)ii];
                
                Dictionary<int, string> hostDic = new Dictionary<int, string>();
                for (int t = 1; t < threadCount; t++)
                {
                    hostDic.Add(t, Convert.ToString(dataGridView2.Rows[t-1].Cells[2].Value));
                }
                var host = hostDic[(int)ii];
                IPHostEntry ipHost = Dns.GetHostEntry(host);
                IPAddress ipAddr = ipHost.AddressList[0];
                IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
                // Создаем сокет Tcp/Ip
               
               
                Dictionary<int, Socket> sLib = new Dictionary<int, Socket>();
                for (int t = 1; t <= threadCount; t++)
                {
                    sLib.Add(t, null);
                }
                Socket sListener = sLib[(int)ii];
 
                sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
 
                // Назначаем сокет локальной конечной точке и слушаем входящие сокеты
 
 
 
 
           //Доделать
           try
           {
           sListener.Bind(ipEndPoint);
                
           sListener.Listen(10);
                }
           catch(Exception)
           {
               sListener.Dispose();
           }
          
                //запускаем сервер, указав первоначальные параметры
                proc.StartInfo.FileName = Convert.ToString(pathForServer);
                proc.StartInfo.UseShellExecute = false;
                proc.Start();
                while (true)
                {
                    Thread.Sleep(2000);
                    try
                    {
                        // Программа приостанавливается, ожидая входящее соединение
                        handler = sListener.Accept();
                    }
                    // если входящего соединения нет, выйти из цикла.(Ждет соединение около 6 секунд)
                    catch (ObjectDisposedException ex)
                    {
                        //чтоб выйти из цикла, иначе выдает ошибку
                        break;
                    }
                    string message = null;
                    // Мы дождались клиента, пытающегося с нами соединиться
                    byte[] bytes = new byte[1024];
                    try
                    { 
                    int bytesRec = handler.Receive(bytes);
                    message += Encoding.UTF8.GetString(bytes, 0, bytesRec);
                    }
                    catch(SocketException)
                    {
                        break;
                    }
                    
                    // Отправляем ответ серверу
                    var reply = "Спасибо за запрос в " + message.Length.ToString()
                            + " символов";
                    byte[] msg = Encoding.UTF8.GetBytes(reply);
                    handler.Send(msg);
                    dataTime = DateTime.Now;
                    //Метод инвок вызывает делегат в том потоке, где находится datagrid
                    fff.dataGridView1.Invoke((MethodInvoker)delegate { fff.dataGridView1.Rows.Insert(0, dataTime, "Socket", message); });
                    if (fff.dataGridView1.Rows.Count > numberRawsForDelete)
                    {
                        fff.dataGridView1.Invoke((MethodInvoker)delegate { fff.dataGridView1.Rows.RemoveAt(fff.dataGridView1.Rows.Count - 2); });
                    }
                   
                }
       }


кнопка, которая запускает



C#
1
2
3
4
5
6
7
threadCount = dataGridView2.Rows.Count;
            for (int ii = 1; ii < threadCount; ii++)
            {
                Thread myThread = new Thread(new ParameterizedThreadStart(ProcedureForFirstServer));
                myThread.Start(ii);
 
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2018, 09:21
Ответы с готовыми решениями:

Сложно ли сделать лаунчер к игре и его подключение к серверу игры
Хочу сделать лаунчер на C#. Но написать его, это одно а вот подключить его к...

Многопоточность: Открыть форму и, сразу после её открытия, запустить подключение к удалённому серверу
В общем, мне нужно сделать следующее: - открыть форму и, сразу после её...

Необходимо сделать перебор ip-адресов которые находятся в текстовом файле для подключение к серверу (while)
Нужно что бы через while программа перебирала ip в файле, и выход из цикла...

Подключение к серверу, не зная его ip адреса
У меня есть 2 приложения: сервер и клиент. Мне нужно из клиента подключиться к...

Одновременное подключение несколько клиентов к одному серверу
Столкнулся с задачей. Есть сервер, который отправляет xml сообщения на клиент....

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2018, 09:21

Передача аргументов запущенному приложению
Возможно ли передать аргументы уже запущенному приложению? Заранее благодарю...

Послать команду запущенному приложению (процессу)
Существует возможность послать команду запасающемуся приложению из командной...

Передача команды стороннему (запущенному) приложению
Как возможно передавать команду запущенному приложению? Необходимо в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru