2009-04-07 14 views
9

Desidero inviare dati tramite Internet tramite un'applicazione desktop. Conosco un po 'le prese. Ho trasferito i dati all'interno della LAN, ma ora voglio trasferire i dati su Internet. Qual è il modo migliore per trasferire grandi e piccole quantità di dati?Come posso inviare dati via internet tramite una presa?

Il mio sistema è collegato al server che ha accesso a Internet. L'indirizzo IP del mio sistema è dinamico. Non so come inviare i dati a un altro sistema connesso a Internet. Devo trovare l'indirizzo del router? (Il mio indirizzo IP è generato come 192.168.1.15).

Si sta utilizzando un socket sufficiente o è richiesto HTTP?

+0

Al livello di cui si sta parlando, non c'è molta differenza tra LAN e Internet (devi solo pensare al NAT). Che tipo di dati stai trasferendo? Se stai prendendo di mira più piattaforme, tieni presente che le rappresentazioni dei dati ASCII variano a seconda dei sistemi operativi. –

risposta

15

La presa è sufficiente se non sono coinvolti firewall/proxy.

Ma, poiché Internet è coinvolto (non la connessione più veloce), suggerisco per motivi di convenienza che dovresti optare per il servizio di remoting su http. In questo modo, anche se in futuro l'installazione cambia e i firewall/i proxy vengono coinvolti nell'equazione, non dovresti preoccuparti.

+0

OK, va bene questa risposta è stata downvoted. Mi piacerebbe sapere il motivo - solo per scopi autodidattici :) –

+0

In suvated perché non vedo alcun motivo per il downvote. :) In più mi piace la risposta. –

+0

Penso che sia per errore – Mohanavel

1

Nella tua domanda mescoli cose diverse. I socket sono un'astrazione per le comunicazioni di rete. Avrai sicuramente bisogno di un socket per comunicare attraverso la rete. Tuttavia, probabilmente non vedrai che viene utilizzato un socket (come in un browser web). Http è un protocollo di comunicazione. Questo è ciò che passa attraverso un canale di comunicazione.

0

Visual Studio dispone di molte strutture ben create per la creazione e il consumo di servizi Web XML SOAP. Guarderei dentro se fossi in te. Certo, c'è un sovraccarico, ma la codifica è estremamente semplice.

Ovviamente, non sono sicuro di quanto si ridurrebbe se si dovesse trasferire, ad esempio, decine o centinaia di megabyte di dati attraverso connessioni Internet lente. Offre l'I/O asincrono, ma non penso che si possa ottenere un indicatore di avanzamento, e la maggior parte sicuramente non è una funzionalità di ripresa.

Aggiunto: È inoltre possibile continuare a utilizzare la presa. Non è richiesto alcun lavoro aggiuntivo per la connessione a un server su Internet. Basta specificare l'indirizzo IP del server e via. Il tuo sistema operativo si prenderà cura di tutti i dettagli cruenti come router, pacchetti mancanti, ecc.

3

Puoi farlo con la classe Socket .Net o puoi lavorare con la classe TcpClient più conveniente.

Prima di tutto è necessario capire a quale server si intende comunicare. È un server HTTP o un server FTP? Sia HTTP che FTP sono protocolli a livello di applicazione che vengono implementati su socket (using), che in realtà è un'interfaccia del livello di trasporto.

L'indirizzo IP locale o l'indirizzo del router non ha importanza. Tuttavia, è necessario conoscere l'indirizzo IP dell'host remoto a cui si desidera connettersi. È possibile ottenere questo chiamando:

IPHostEntry host; 

host = Dns.GetHostEntry(hostname); 

si potrebbe anche voler pensare su altri problemi quando si lavora con gli zoccoli, come l'utilizzo di timeout per mascherare il fallimento, la possibilità di riprendere di upload/download durante il trasferimento di file di grandi dimensioni, ecc Se passi qualche tempo a cercare in rete, dovresti essere in grado di trovare apis HTTP/FTP di livello superiore che ti consentiranno di lavorare con i trasferimenti di file molto più facilmente.

A giudicare dalla tua domanda, ti sembra abbastanza nuovo per i socket, così la lettura this potrebbe anche aiutare

0

primo luogo si dovrebbe prendere una decisione quale protocollo che si desidera utilizzare TCP o UDP. Quindi hai due opzioni: 1. usa Socket (livello inferiore) o 2. Usa classe come TCPClient o UDPClient (che rappresenta un'astrazione leggermente più alta. Suggerirei (per l'accattonaggio la seconda opzione)

0

Cosa volete sapere dipende fortemente su molte parti della vostra infrastruttura.

Se si desidera inviare i dati a un server che è trasparente collegato a internet, è semplice come collegare al suo indirizzo IP.

Se vuoi connetterti ad un amico con una connessione a banda larga, le cose diventano complicate. Di solito devi configurare entrambi i tuoi router (o almeno quello di destinazione ) per NAT.

Familiarizzare con NAT e le basi del routing IP. I dettagli forniti non sono sufficienti per descrivere esattamente cosa si vuole fare .

10

Se tutto ciò che si vuole fare è trasferire i dati grezzi da una macchina all'altra è molto facile farlo usando un socket TCP.

Ecco un breve esempio.

Server:

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:

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

Maggiori informazioni sulla connessione esigenze è necessario al fine di dare una soluzione adeguata. Ci sono molti protocolli a tua disposizione e ci sono dei compromessi per tutti loro. Probabilmente sceglierai uno di questi due transport layers:

UDP - Questo è un metodo di invio e dimenticanza di invio di pacchetti. Buono per lo streaming multimediale che non deve necessariamente essere corretto al 100%.

La buona:

  1. Nessuna connessione necessaria.
  2. Molto leggero.

La cattiva:

  1. Nessuna garanzia del vostro pacchetto di raggiungere la destinazione (anche se la maggior parte del tempo lo fanno).
  2. I pacchetti possono arrivare fuori dall'ordine in cui li hai inviati.
  3. Nessuna garanzia che il loro contenuto sia lo stesso di quando ha inviato il pacchetto.

TCP - Si tratta di un protocollo basato sulla connessione che garantisce un comportamento prevedibile.

La buona:

  1. si sa per certo se il pacchetto ha raggiunto la destinazione o meno.
  2. I pacchetti arriveranno nell'ordine in cui sono stati inviati.
  3. Si è garantito che il 99,99999999% del tempo in cui i pacchetti arriveranno con i loro contenuti inalterati.
  4. Controllo del flusso: se la macchina che invia pacchetti sta trasmettendo troppo rapidamente, la macchina ricevente è in grado di limitare la velocità di invio dei pacchetti del mittente.

La cattiva:

  1. richiede una connessione da stabilire.
  2. Notevole maggiore overhead rispetto a UDP.

L'elenco di pro e contro non è affatto completo ma dovrebbe essere abbastanza informazioni per darti la possibilità di prendere una decisione informata. Se possibile, è consigliabile avvalersi dei protocolli basati su application layer già esistenti, ad esempio HTTP se si trasferisce testo ASCII, FTP se si trasferiscono file e così via.

Problemi correlati