Клиент-Сервер. Удалённый сервер - C#
Формулировка задачи:
Всем здравствуйте. Я заинтересовался написать клиент-сервер приложение.
Написал я отдельную консольную программу сервера и клиента.
Вот к примеру имеется серверная часть:
У меня выходит так, что от клиента к серверу можно обращаться только если сервер включен на этом-же компе что и клиент, а если сервер находится на другом компьютере, то пакет тупо не доходит до сервера и ответа, соответственно, нет.
Так как сделать так, чтобы к серверу можно было обратиться, если сервер запущен на другом компьютере(через интернет), зная его ip-адрес.
namespace ExampleTcpListener_Console { class ExampleTcpListener { static void Main(string[] args) { TcpListener server = null; try { // Определим нужное максимальное количество потоков // Пусть будет по 4 на каждый процессор int MaxThreadsCount = Environment.ProcessorCount * 4; Console.WriteLine(MaxThreadsCount.ToString()); // Установим максимальное количество рабочих потоков ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount); // Установим минимальное количество рабочих потоков ThreadPool.SetMinThreads(2, 2); // Устанавливаем порт для TcpListener = 9595. Int32 port = 9595; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); int counter = 0; server = new TcpListener(localAddr, port); // Запускаем TcpListener и начинаем слушать клиентов. server.Start(); // Принимаем клиентов в бесконечном цикле. while (true) { Console.Write("\nWaiting for a connection... "); // При появлении клиента добавляем в очередь потоков его обработку. ThreadPool.QueueUserWorkItem(ObrabotkaZaprosa,server.AcceptTcpClient()); // Выводим информацию о подключении. counter++; Console.Write("\nConnection №" + counter.ToString() + "!"); } } catch (SocketException e) { //В случае ошибки, выводим что это за ошибка. Console.WriteLine("SocketException: {0}", e); } finally { // Останавливаем TcpListener. server.Stop(); } Console.WriteLine("\nHit enter to continue..."); Console.Read(); } static void ObrabotkaZaprosa(object client_obj) { // Буфер для принимаемых данных. Byte[] bytes = new Byte[256]; String data = null; //Можно раскомментировать Thread.Sleep(1000); //Запустить несколько клиентов //и наглядно увидеть как они обрабатываются в очереди. //Thread.Sleep(1000); TcpClient client = client_obj as TcpClient; data = null; // Получаем информацию от клиента NetworkStream stream = client.GetStream(); int i; // Принимаем данные от клиента в цикле пока не дойдём до конца. while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { // Преобразуем данные в ASCII string. data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); // Преобразуем строку к верхнему регистру. data = data.ToUpper(); // Преобразуем полученную строку в массив Байт. byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); // Отправляем данные обратно клиенту (ответ). stream.Write(msg, 0, msg.Length); } // Закрываем соединение. client.Close(); } } }
Решение задачи: «Клиент-Сервер. Удалённый сервер»
textual
Листинг программы
server = new TcpListener(IPAddress.Any, port);