2009-04-07 4 views
9

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

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

Используется достаточно гнездо или требуется HTTP?

+0

На слое, о котором вы говорите, нет никакой разницы между локальной сетью и Интернетом (вам просто нужно думать о NAT). Какие данные вы передаете? Если вы ориентируетесь на несколько платформ, имейте в виду, что представления данных ASCII различаются между операционными системами. –

ответ

15

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

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

+0

ОК, это нормально, этот ответ был опущен. Я хотел бы знать причину - только для целей самообразования :) –

+0

Упрощенный, потому что я не вижу причины для downvote. :) Плюс мне нравится ответ. –

+0

Я думаю, что это по ошибке – Mohanavel

1

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

0

В Visual Studio есть много возможностей для создания и использования SOAP XML Web Services. Я бы посмотрел на него, если бы был вами. Конечно, есть некоторые накладные расходы, но кодирование против него чрезвычайно просто.

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

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

3

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

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

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

IPHostEntry host; 

host = Dns.GetHostEntry(hostname); 

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

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

0

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

0

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

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

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

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

10

Если все, что вы хотите сделать, это передача необработанных данных с одного компьютера на другой, это очень просто сделать, используя 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(); 
8

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

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

Хорошая:

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

Плохая:

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

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

Хорошая:

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

Плохая:

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

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

Смежные вопросы