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