如何使用套接字通过互联网发送数据?

时间:2009-04-07 14:46:22

标签: c# sockets networking

我想通过桌面应用程序通过互联网发送数据。我对插座有点了解。我已在局域网内传输数据,但现在我想通过互联网传输数据。传输大量和小量数据的最佳方法是什么?

我的系统已连接到可以访问互联网的服务器。我系统的IP地址是动态的。我不知道如何将数据发送到连接到互联网的另一个系统。我需要找到路由器地址吗? (我的IP地址生成为192.168.1.15)。

是否使用了足够的套接字,或者是否需要HTTP?

8 个答案:

答案 0 :(得分:17)

如果不涉及防火墙/代理,套接字就足够了。

但是,由于涉及互联网(不是最快的连接),我建议为了方便起见,你最好选择通过http进行远程连接。这样,即使将来设置发生变化,防火墙/代理也参与到等式中,您也不必担心。

答案 1 :(得分:13)

如果您只想将原始数据从一台机器传输到另一台机器,那么使用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();

答案 2 :(得分:9)

需要有关您的连接需求的更多信息才能为您提供合适的解决方案。您可以使用许多协议,并且所有这些协议都需要权衡。您可能会选择以下两个中的一个transport layers

UDP - 这是一种发送数据包的“发送 - 忘记”方法。适用于不必100%正确的流媒体。

好处:

  1. 无需连接。
  2. 非常轻巧。
  3. 坏事:

    1. 不保证您的数据包到达目的地(尽管他们大多数时间都是这样做的。)
    2. 数据包可以不按您发送的顺序到达。
    3. 不保证其内容与发送数据包时的内容相同。
    4. TCP - 这是一种基于连接的协议,可以保证可预测的行为。

      好处:

      1. 您将确定数据包是否已到达目的地。
      2. 数据包将按照您发送的顺序到达。
      3. 您可以保证99.999999999%的数据包到达时内容不会改变。
      4. 流量控制 - 如果发送数据包的机器发送得太快,接收机器可以限制发送方的数据包发送速率。
      5. 坏事:

        1. 需要建立连接。
        2. 比UDP更多的开销。
        3. 利弊列表并非完整,但它应该是足够的信息,使您能够做出明智的决定。如果可能,您应该利用已存在的基于application layer的协议,例如HTTP如果要传输ASCII文本,FTP如果要传输文件,等等。< / p>

答案 3 :(得分:3)

您可以使用.Net的Socket类来完成它,或者您可以使用更方便的TcpClient类。

首先,您需要确定要与之通信的服务器。它是HTTP服务器还是FTP服务器? HTTP和FTP都是应用程序级协议,它们是在(使用)套接字上实现的,它实际上是一个传输层接口。

您的本地IP地址或路由器的地址确实无关紧要。但是,您需要知道要连接的远程主机的IP地址。您可以致电:

获取此信息
IPHostEntry host;

host = Dns.GetHostEntry(hostname);

使用套接字时,您可能还想考虑其他问题,例如使用超时来屏蔽故障,在传输大文件时恢复上传/下载的可能性等等。如果你花一些时间在网上查看,你应该能够找到更高级别的HTTP / FTP apis,让您更轻松地处理文件传输。

根据您的问题判断,您似乎对套接字很新,所以阅读this也可能会有所帮助

答案 4 :(得分:1)

在你的问题中你混合了不同的东西。套接字是网络通信的抽象。您肯定需要一个套接字来通过网络进行通信。但是,您可能不会看到使用套接字(如在Web浏览器中)。 Http是一种通信协议。这是通过沟通渠道的。

答案 5 :(得分:0)

Visual Studio拥有许多用于创建和使用SOAP XML Web服务的良好工具。如果我是你,我会调查它。当然,有一些开销,但编码很容易。

当然,如果您不得不通过慢速互联网连接转移数十或几千兆字节的数据,我不确定这会扩展得多好。它确实提供了异步I / O,但我认为你不能获得进度指示器,而且最肯定的不是恢复功能。

已添加:您还可以继续使用套接字。通过互联网连接到服务器没有额外的工作。只需指定服务器的IP地址,即可离开。您的操作系统将处理所有血腥细节,如路由器,丢失数据包等。

答案 6 :(得分:0)

首先,您应该决定要使用TCP或UDP的协议。然后你有两个选择:1。使用Socket(更低级别)或2.使用类似TCPClient或UDPClient(代表更高的抽象。 我建议(为了乞求第二种选择)。

答案 7 :(得分:0)

您想要了解的内容在很大程度上取决于您基础架构的许多部分。

如果要将数据发送到透明连接的服务器 到互联网,它就像连接到它的IP地址一样容易。

如果你想通过宽带连接与某些朋友联系,那就好了 变得棘手。您通常必须配置两个路由器(或至少配置 目标一)用于NAT。

熟悉NAT,以及IP路由的基础知识。 您提供的详细信息不足以准确描述 你想做什么。