Как я могу отправить данные через Интернет с помощью сокета? - PullRequest
11 голосов
/ 07 апреля 2009

Я хотел бы отправить данные через Интернет через настольное приложение. Я немного знаю о розетках. Я передал данные в локальной сети, но теперь я хочу передать данные через Интернет. Каков наилучший способ передачи больших и малых объемов данных?

Моя система подключена к серверу, который имеет доступ к Интернету. IP-адрес моей системы является динамическим. Я не знаю, как отправить данные в другую систему, которая подключена к Интернету. Нужно ли найти адрес маршрутизатора? (Мой IP-адрес создается как 192.168.1.15).

Достаточно ли используется сокет или требуется HTTP?

Ответы [ 8 ]

17 голосов
/ 07 апреля 2009

Сокета достаточно, если не задействованы брандмауэры / прокси.

Но так как Интернет задействован (не самое быстрое соединение), я предлагаю для удобства вам лучше выбрать удаленное взаимодействие через http. Таким образом, даже если в будущем настройка изменится, и в уравнении будут задействованы брандмауэры / прокси, вам не стоит беспокоиться.

13 голосов
/ 07 апреля 2009

Если все, что вы хотите сделать - это передать необработанные данные с одного компьютера на другой, это очень легко сделать с помощью сокета TCP.

Вот краткий пример.

Сервер:

 ThreadPool.QueueUserWorkItem(StartTCPServer);

 private static void StartTCPServer(object state) {
        TcpListener tcpServer = new TcpListener(IPAddress.Parse("192.168.1.15"), 5442);
        tcpServer.Start();
        TcpClient client = tcpServer.AcceptTcpClient();

        Console.WriteLine("Client connection accepted from " + client.Client.RemoteEndPoint + ".");

        StreamWriter sw = new StreamWriter("destination.txt");

        byte[] buffer = new byte[1500];
        int bytesRead = 1;

        while (bytesRead > 0) {
            bytesRead = client.GetStream().Read(buffer, 0, 1500);

            if (bytesRead == 0) {
                break;
            }

            sw.BaseStream.Write(buffer, 0, bytesRead);
            Console.WriteLine(bytesRead + " written.");
        }

        sw.Close();
    }

Клиент:

 StreamReader sr = new StreamReader("source.txt");

 TcpClient tcpClient = new TcpClient();
 tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.15"), 5442));

 byte[] buffer = new byte[1500];
 long bytesSent = 0;

 while (bytesSent < sr.BaseStream.Length) {
        int bytesRead = sr.BaseStream.Read(buffer, 0, 1500);
        tcpClient.GetStream().Write(buffer, 0, bytesRead);
        Console.WriteLine(bytesRead + " bytes sent.");

        bytesSent += bytesRead;
  }

  tcpClient.Close();

  Console.WriteLine("finished");
  Console.ReadLine();
9 голосов
/ 07 апреля 2009

Требуется больше информации о ваших потребностях в соединении, чтобы дать вам соответствующее решение. В вашем распоряжении много протоколов, и для них есть компромисс. Вероятно, вы выберете один из этих двух транспортных слоев :

UDP - Это метод отправки и забывания пакетов. Подходит для потокового мультимедиа, которое не обязательно должно быть на 100% правильным.

Хорошее:

  1. Соединение не требуется.
  2. Очень легкий.

Плохо:

  1. Нет гарантии того, что ваш пакет достигнет пункта назначения (хотя большую часть времени они его делают).
  2. Пакеты могут поступать из того порядка, в котором вы их отправили.
  3. Нет гарантии, что их содержимое такое же, как при отправке пакета.

TCP - это протокол на основе соединений, который гарантирует предсказуемое поведение.

Хорошее:

  1. Вы будете точно знать, достиг ли пакет адресата или нет.
  2. Пакеты будут доставлены в том порядке, в котором вы их отправили.
  3. Вам гарантировано, что 99.999999999% времени ваши пакеты будут доставлены с неизменным содержанием.
  4. Управление потоком - если машина, отправляющая пакеты, отправляет слишком быстро, машина-получатель может регулировать скорость отправки пакетов отправителем.

Плохое:

  1. Требуется установить соединение.
  2. Значительно больше накладных расходов, чем UDP.

Список плюсов и минусов отнюдь не полон, но информации должно быть достаточно, чтобы дать вам возможность принять обоснованное решение. Если возможно, вы должны воспользоваться уже существующими протоколами на уровне приложений , такими как HTTP , если вы переносите текст ASCII, FTP , если вы переносите файлы и т. д.

3 голосов
/ 07 апреля 2009

Вы можете сделать это с помощью класса Socket .Net или работать с более удобным классом TcpClient.

Во-первых, вам нужно выяснить, с каким сервером вы собираетесь общаться. Это HTTP-сервер или FTP-сервер? Как HTTP, так и FTP являются протоколами уровня приложений, которые реализованы поверх (с использованием) сокетов, которые на самом деле являются интерфейсом транспортного уровня.

Ваш локальный IP-адрес или адрес маршрутизатора действительно не имеет значения. Однако вам необходимо знать IP-адрес удаленного хоста, к которому вы собираетесь подключиться. Вы можете получить это по телефону:

IPHostEntry host;

host = Dns.GetHostEntry(hostname);

Вы также можете подумать о других проблемах при работе с сокетами, таких как использование тайм-аутов для маскировки сбоя, возможность возобновления загрузки / выгрузки при передаче больших файлов и т. Д. Если вы проводите какое-то время, просматривая сеть, вам следует сможете найти HTTP / API-интерфейсы более высокого уровня, которые позволят вам гораздо легче работать с файлами.

Судя по вашему вопросу, вы, кажется, довольно плохо знакомы с сокетами, поэтому чтение this может также помочь

1 голос
/ 07 апреля 2009

В своем вопросе вы смешиваете разные вещи. Сокеты - это абстракция для сетевого общения. Вам наверняка понадобится сокет для связи по сети. Однако, возможно, вы не увидите, что используется сокет (как в веб-браузере). Http является протоколом связи. Это то, что проходит через канал связи.

0 голосов
/ 07 апреля 2009

То, что вы хотите знать, сильно зависит от многих частей вашей инфраструктуры.

Если вы хотите отправить данные на сервер, который прозрачно подключен к Интернету это так же просто, как подключиться к IP-адресу.

Если вы хотите подключиться к какому-либо другу с помощью широкополосного подключения, вещи получить хитрый. Обычно вам необходимо настроить оба маршрутизатора (или, по крайней мере, цель одна) для NAT.

Ознакомьтесь с NAT и основами IP-маршрутизации. Предоставленные вами данные недостаточны для точного описания того, что Вы хотите сделать.

0 голосов
/ 07 апреля 2009

Сначала вы должны решить, какой протокол вы хотите использовать TCP или UDP. Тогда у вас есть два варианта: 1. использовать Socket (более низкий уровень) или 2. использовать класс, такой как TCPClient или UDPClient (который представляет немного более высокую абстракцию) Я бы предложил (для попрошайничества второй вариант).

0 голосов
/ 07 апреля 2009

Visual Studio имеет множество хорошо сделанных средств для создания и использования веб-служб SOAP XML. Я бы посмотрел на это на твоем месте. Конечно, есть некоторые накладные расходы, но их кодирование чрезвычайно просто.

Конечно, я не уверен, насколько хорошо это масштабировалось бы, если бы вам пришлось передавать, скажем, десятки или сотни мегабайт данных через медленные интернет-соединения. Он предлагает асинхронный ввод-вывод, но я не думаю, что вы можете получить индикатор прогресса, и, скорее всего, нет функции возобновления.

Добавлено: Вы также можете продолжить использовать свой сокет. Для подключения к серверу через Интернет не требуется дополнительная работа. Просто укажите IP-адрес сервера, и все готово. Ваша ОС позаботится обо всех подробностях, таких как маршрутизаторы, пропущенные пакеты и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...