我想通过桌面应用程序通过互联网发送数据。我对插座有点了解。我已在局域网内传输数据,但现在我想通过互联网传输数据。传输大量和小量数据的最佳方法是什么?
我的系统已连接到可以访问互联网的服务器。我系统的IP地址是动态的。我不知道如何将数据发送到连接到互联网的另一个系统。我需要找到路由器地址吗? (我的IP地址生成为192.168.1.15)。
是否使用了足够的套接字,或者是否需要HTTP?
答案 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%正确的流媒体。
好处:
坏事:
TCP - 这是一种基于连接的协议,可以保证可预测的行为。
好处:
坏事:
利弊列表并非完整,但它应该是足够的信息,使您能够做出明智的决定。如果可能,您应该利用已存在的基于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路由的基础知识。 您提供的详细信息不足以准确描述 你想做什么。