2009-04-07 11 views
9

私は、デスクトップアプリケーションを通じてインターネットを介してデータを送信したいと考えています。私はソケットについて少し知っています。私はLAN内のデータを転送しましたが、今はインターネット経由でデータを転送したいと考えています。大量データと少量データの両方を転送する最良の方法は何ですか?ソケットを使用してインターネットでデータを送信するにはどうすればよいですか?

私のシステムは、インターネットにアクセスできるサーバーに接続されています。私のシステムのIPアドレスは動的です。私はインターネットに接続されている別のシステムにデータを送る方法を知らない。私はルータのアドレスを見つける必要がありますか? (私のIPアドレスは192.168.1.15として生成されます)。

ソケットを十分に使用していますか、またはHTTPが必要ですか?

+0

あなたが話しているレイヤでは、LANとインターネットの違いはあまりありません(NATについて考える必要があります)。どのタイプのデータを転送していますか?複数のプラットフォームをターゲットとする場合は、オペレーティングシステムによってASCIIデータ表現が異なることに注意してください。 –

答えて

15

ファイアウォール/プロキシが関係しない場合は、ソケットで十分です。

しかし、インターネットが(最速の接続ではなく)関わっているので、私は便宜のために、httpでのリモート処理をよりよく選択するべきです。そうすれば、将来的に設定が変更され、ファイアウォール/プロキシが関係する場合でも、心配する必要はありません。

+0

OK、これは解決しました。理由を知りたいのですが、自己教育目的のためだけです:) –

+0

私はdownvoteの理由がないので、Upvoted。 :)プラス私は答えが好きです。 –

+0

私は間違って思う – Mohanavel

1

あなたの質問には、異なるものを混在させてください。ソケットは、ネットワーク通信の抽象です。あなたは確かにネットワークを介して通信するソケットが必要になります。しかし、おそらくあなたはソケットが使用されているのを見ることはできません(Webブラウザのように)。 Httpは通信プロトコルです。これが通信チャネルを通るものです。

0

Visual Studioには、SOAP XML Webサービスを作成して使用するための機能が豊富に用意されています。私があなたであれば、私はそれを調べます。確かに、いくつかのオーバーヘッドがありますが、それに対するコーディングは非常に簡単です。

もちろん、低速のインターネット接続で数十万のデータを転送しなければならないとすれば、どれくらい規模が拡大するかはわかりません。これは非同期I/Oを提供しますが、私はあなたが進捗インジケーターを得ることはできないと思っています。そして、ほとんどの場合、レジューム機能はありません。

追加:あなたのソケットを引き続き使用することもできます。インターネットを介してサーバーに接続するための余分な作業はありません。サーバーのIPアドレスを指定するだけで、離れて行くことができます。お使いのOSは、ルーターや欠落しているパケットなどの細部をすべて処理します。

3

.NetのSocketクラスを使用するか、より便利なTcpClientクラスを使用できます。

まず、通信するサーバーを特定する必要があります。それはHTTPサーバーかFTPサーバーですか? HTTPとFTPの両方はアプリケーションレベルのプロトコルであり、実際にはトランスポート層インタフェースであるソケットの上に実装されています。

あなたのローカルIPアドレスまたはルータのアドレスは実際には関係ありません。ただし、接続しようとするリモートホストのIPアドレスを知る必要があります。あなたは呼び出すことで、これを入手することができます

IPHostEntry host; 

host = Dns.GetHostEntry(hostname); 

などこのような障害をマスクするためにタイムアウトを使用するなど、ソケット、大容量のファイルを転送するときに、アップロード/ダウンロードを再開する可能性、で作業するときは、また、その他の問題について考えたいかもしれませんいつかネットを見て回ると、より簡単にファイル転送を扱うことができる、より高いレベルのHTTP/FTP APIを見つけることができるはずです。

あなたの質問から判断

、あなたはとてもthisも、あなたはTCPやUDPを使用したいプロトコルの決定をしなければならない

0

ファーストを助けるかもしれない読んで、ソケットにかなり新しいように見えます。 1.ソケット(下位レベル)を使用するか、2. TCPClientまたはUDPClient(より高い抽象化を表す)を使用します。 私はお勧めします(2番目のオプションを募集しています)。

0

あなたは、インフラストラクチャの多くの部分に大きく依存知りたい。

あなたは透過的にインターネットに を接続しているサーバーにデータを送信したい場合は、それに接続するのと同じくらい簡単ですのIPアドレスです。

ブロードバンド接続で友人に接続したい場合は、 は手間がかかります。通常は、両方のルータを設定する必要があります(または少なくとも のターゲット)をNAT用に使用します。

NATとIPルーティングの基本について熟知してください。 あなたが提供した詳細は、あなたが何をしたいのかを正確に記述するのに十分ではありません。

10

rawデータをあるマシンから別のマシンに転送するだけであれば、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

詳しい情報は、あなたに適切なソリューションを提供するために必要とされます。あなたの処分には多くのプロトコルがあり、それらのすべてにトレードオフがあります。おそらくこれらの2つのうちの1つを選択します。transport layers

UDP - これは、パケットの送信と忘れの方法です。必ずしも100%正確である必要はないストリーミングメディアに適しています。

良い:必要

  1. の接続がありません。
  2. 非常に軽量です。

悪い:

  1. (彼らはそれを作るほとんどの時間が)先に到達し、あなたのパケットの保証無し。
  2. パケットは、送信した順番通りに到着することができません。
  3. パケットを送信したときと同じ内容であるという保証はありません。

TCP - これは予測可能な動作を保証する接続ベースのプロトコルです。

良い:

  1. あなたは、パケットが宛先に到達したか否かを確実に知ることができます。
  2. パケットは送信した順序で到着します。
  3. パケットの内容が変更されずにパケットが到着する時間の99.999999999%が保証されます。
  4. フロー制御 - パケットを送信しているマシンがあまりにも速く送信している場合、受信側のマシンは送信側のパケット送信レートを抑制できます。

悪い:

  1. が確立される接続が必要です。
  2. UDPよりもかなりオーバーヘッドです。

賛否両論のリストは決して完全ではありませんが、十分な情報で十分な情報を得て決定することができます。可能であれば、ASCIIテキストを転送する場合はHTTP、ファイルを転送する場合はFTPなど、すでに存在するapplication layerベースのプロトコルを利用する必要があります。

関連する問題