2009-04-07 10 views
9

Me gustaría enviar datos a través de Internet a través de una aplicación de escritorio. Sé un poco sobre enchufes. He transferido los datos dentro de la LAN, pero ahora quiero transferir los datos a través de Internet. ¿Cuál es la mejor manera de transferir grandes y pequeñas cantidades de datos?¿Cómo puedo enviar datos a través de Internet usando un socket?

Mi sistema está conectado al servidor que tiene acceso a internet. La dirección IP de mi sistema es dinámica. No sé cómo enviar los datos a otro sistema que está conectado a internet. ¿Necesito encontrar la dirección del enrutador? (Mi dirección IP se genera como 192.168.1.15).

¿Está utilizando un zócalo lo suficiente o se requiere HTTP?

+0

En la capa de la que está hablando, no hay mucha diferencia entre LAN e Internet (realmente solo tiene que pensar en NAT). ¿Qué tipo de datos estás transfiriendo? Si se dirige a múltiples plataformas, tenga en cuenta que las representaciones de datos ASCII varían según los sistemas operativos. –

Respuesta

15

El zócalo es suficiente si no hay servidores de seguridad/proxies implicados.

Pero, como Internet está involucrado (no es la conexión más rápida), sugiero que, por conveniencia, es mejor optar por la conexión remota a través de http. De esta forma, incluso si en el futuro la configuración cambia, y los servidores de seguridad/proxies se involucran en la ecuación, no debe preocuparse.

+0

OK, está bien, esta respuesta fue downvoted. Me gustaría saber el motivo, solo para fines de autoeducación :) –

+0

Voto a favor porque no veo ninguna razón para el voto en baja. :) Además, me gusta la respuesta. –

+0

Creo que es por error – Mohanavel

1

En tu pregunta puedes mezclar cosas diferentes. Los zócalos son una abstracción para la comunicación de red. Sin duda necesitará un socket para comunicarse a través de la red. Sin embargo, posiblemente no veas que se usa un socket (como en un navegador web). Http es un protocolo de comunicación. Esto es lo que pasa por un canal de comunicación.

0

Visual Studio tiene muchas instalaciones bien hechas para crear y consumir servicios web XML de SOAP. Lo investigaría si fuera tú. Claro, hay algunos gastos generales, pero la codificación en contra es extremadamente fácil.

Por supuesto, no estoy seguro de qué tan bien podría escalar si tuviera que transferir, digamos, decenas o cientos de megabytes de datos a través de conexiones a Internet lentas. Ofrece E/S asíncronas, pero no creo que pueda obtener un indicador de progreso, y definitivamente no es una funcionalidad de reanudación.

Agregado: También puede continuar utilizando su zócalo. No se requiere trabajo adicional para conectarse a un servidor a través de Internet. Solo especifique la dirección IP del servidor, y listo. Su sistema operativo se encargará de todos los detalles sangrientos como enrutadores, paquetes faltantes, etc.

3

Puede hacerlo con la clase Socket de .NET o puede trabajar con la clase más conveniente TcpClient.

En primer lugar, debe averiguar con qué servidor desea comunicarse. ¿Es un servidor HTTP o un servidor FTP? HTTP y FTP son protocolos de nivel de aplicación que se implementan sobre (usando) sockets, que es realmente una interfaz de capa de transporte.

Su dirección IP local o la dirección del enrutador realmente no son importantes. Sin embargo, debe conocer la dirección IP del host remoto al que desea conectarse. Puede obtener esta llamando:

IPHostEntry host; 

host = Dns.GetHostEntry(hostname); 

También puede ser que desee pensar en otras cuestiones cuando se trabaja con tomas, como el uso de los tiempos de espera para enmascarar el fracaso, la posibilidad de reanudar la carga/descarga de archivos de gran tamaño al transferir, etc. Si pasas algún tiempo buscando en la red, deberías poder encontrar aplicaciones HTTP/FTP de mayor nivel que te permitan trabajar con transferencias de archivos mucho más fácilmente.

A juzgar por su pregunta, que parece bastante nuevo en tomas de corriente, por lo que la lectura this también podría ayudar a

0

En primer lugar debe tomar una decisión lo protocolo que desea utilizar TCP o UDP. Luego tiene dos opciones: 1. use Socket (nivel inferior) o 2. Use clase como TCPClient o UDPClient (que representa una abstracción un poco más alta. Sugeriría (para empezar la segunda opción).

0

What quieres saber depende en gran medida de muchas partes de su infraestructura.

Si desea enviar datos a un servidor que está conectado de forma transparente a internet, es tan fácil como conectar a su dirección IP.

Si desea conectarse con un amigo con una conexión de banda ancha, las cosas se vuelven complicadas. Por lo general, tiene que configurar ambos enrutadores (o al menos el objetivo ) para NAT.

Familiarícese con NAT y los aspectos básicos del enrutamiento IP. Los detalles que proporcionó no son suficientes para describir exactamente qué desea hacer.

10

Si todo lo que quiere hacer es transferir datos sin procesar de una máquina a otra, es muy fácil hacerlo con un socket TCP.

Aquí hay un ejemplo rápido.

Servidor:

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(); 
    } 

cliente: necesidades es necesario

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

Más información sobre su conexión con el fin de darle una solución adecuada. Hay muchos protocolos a su disposición y hay compensaciones para todos ellos. Es probable que elija uno de estos dos transport layers:

UDP - Este es un método de enviar y olvidar paquetes de envío. Bueno para transmisión de medios que no necesariamente tiene que ser 100% correcto.

Lo bueno:

  1. No hay conexión necesaria.
  2. Muy ligero.

Lo malo:

  1. No hay garantía de su paquete de llegar al destino (aunque la mayoría de las veces lo hacen).
  2. Los paquetes pueden llegar del orden en que los envió.
  3. No hay garantía de que sus contenidos sean los mismos que cuando envió el paquete.

TCP - Este es un protocolo basado en la conexión que garantiza un comportamiento predecible.

Lo bueno:

  1. usted sabrá a ciencia cierta si el paquete ha llegado al destino o no.
  2. Los paquetes llegarán en el orden en que los envió.
  3. Tienes garantizado que el 99.99999999% de tus paquetes llegarán sin cambios en su contenido.
  4. Control de flujo: si la máquina envía paquetes demasiado rápido, la máquina receptora puede acelerar la velocidad de envío de paquetes del remitente.

Lo malo:

  1. requiere una conexión que se establezcan.
  2. Considerable más sobrecarga que UDP.

La lista de pros y contras de ninguna manera está completa, pero debe ser suficiente información para darle la capacidad de tomar una decisión informada. Si es posible, debe aprovechar los protocolos basados ​​en application layer que ya existen, como HTTP si está transfiriendo texto ASCII, FTP si está transfiriendo archivos, y así sucesivamente.

Cuestiones relacionadas