Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用套接字通过internet发送数据?_C#_Sockets_Networking - Fatal编程技术网

C# 如何使用套接字通过internet发送数据?

C# 如何使用套接字通过internet发送数据?,c#,sockets,networking,C#,Sockets,Networking,我想通过桌面应用程序通过互联网发送数据。我对插座略知一二。我已经在局域网内传输了数据,但现在我想通过互联网传输数据。传输大量和少量数据的最佳方式是什么 我的系统连接到可以访问internet的服务器。我的系统的IP地址是动态的。我不知道如何将数据发送到另一个连接到internet的系统。我需要找到路由器地址吗?(我的IP地址生成为192.168.1.15) 使用套接字是否足够,或者是否需要HTTP?如果不涉及防火墙/代理,套接字就足够了 但是,由于涉及互联网(不是最快的连接),为了方便起见,我建

我想通过桌面应用程序通过互联网发送数据。我对插座略知一二。我已经在局域网内传输了数据,但现在我想通过互联网传输数据。传输大量和少量数据的最佳方式是什么

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


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

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


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

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

VisualStudio有许多精心制作的工具,用于创建和使用SOAP XML Web服务。如果我是你,我会调查的。当然,会有一些开销,但是针对它进行编码非常容易

当然,我不确定如果你必须通过缓慢的互联网连接传输,比如说,数十兆或数百兆字节的数据,那么它的可扩展性会有多好。它确实提供异步I/O,但我认为您无法获得进度指示器,而且最明显的是,它没有恢复功能


添加:您还可以继续使用套接字。通过internet连接到服务器不需要额外的工作。只需指定服务器的IP地址,就可以了。您的操作系统将处理所有棘手的细节,如路由器、丢失的数据包等。

您可以使用.Net的Socket类或更方便的TcpClient类来处理

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

您的本地IP地址或路由器地址实际上并不重要。但是,您需要知道要连接到的远程主机的IP地址。您可以通过以下方式获得此信息:

IPHostEntry host;

host = Dns.GetHostEntry(hostname);
在使用套接字时,您可能还需要考虑其他问题,例如使用超时来掩盖故障,在传输大文件时恢复上载/下载的可能性,等等。如果您花一些时间上网,您应该能够找到更高级别的HTTP/FTP API,这将使您更轻松地处理文件传输


根据您的问题判断,您似乎对套接字非常陌生,因此阅读可能也会有所帮助。首先,您应该决定使用TCP或UDP协议。那么你有两个选择:1。使用插座(较低级别)或2。使用类,如TCPClient或UDPClient(表示更高一点的抽象)。
我建议(对于乞讨者来说)第二种选择。

您想知道的内容在很大程度上取决于基础设施的许多部分

如果要将数据发送到透明连接的服务器 对于互联网来说,连接到它的IP地址一样简单

如果你想通过宽带连接与朋友联系,你可以 你通常需要配置两个路由器(或者至少两个路由器) 目标1)用于NAT

熟悉NAT和IP路由的基本知识。 您提供的详细信息不足以准确描述
您需要这样做。

如果您只需要将原始数据从一台机器传输到另一台机器,那么使用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();
StreamReader sr=newstreamreader(“source.txt”);
TcpClient TcpClient=新的TcpClient();
tcpClient.Connect(新的IPEndPoint(IPAddress.Parse(“192.168.1.15”),5442));
字节[]缓冲区=新字节[1500];
long-bytesSent=0;
while(bytesSent
需要有关您的连接需求的更多信息,以便为您提供适当的解决方案。您可以使用多种协议,并且对所有协议都有权衡。您可能会选择以下两种协议之一:

-这是一种发送数据包的发送和遗忘方法。适用于不一定100%正确的流媒体

好人:

  • 不需要连接
  • 非常轻
  • 坏消息:

  • 无法保证您的数据包到达目的地(尽管大部分时间他们都能到达)
  • 数据包可能会按照您发送它们的顺序到达
  • 不能保证它们的内容与您发送数据包时的内容相同
  • -这是一个基于连接的协议,可确保可预测的行为

    好人:

  • 您将确定数据包是否已到达目的地
  • 包裹将按照您发送的顺序到达
  • 我们保证您的数据包在99.99999999%的时间到达时内容不变
  • 流量控制-如果发送数据包的机器发送速度过快,则接收机器能够限制发送方的数据包发送速率
  • <