我想通过桌面应用程序通过互联网发送数据.我对插座有点了解.我已在局域网内传输数据,但现在我想通过互联网传输数据.传输大量和小量数据的最佳方法是什么?
我的系统连接到可以访问互联网的服务器.我系统的IP地址是动态的.我不知道如何将数据发送到连接到互联网的另一个系统.我需要找到路由器地址吗?(我的IP地址生成为192.168.1.15).
是否使用了足够的套接字,或者是否需要HTTP?
如果不涉及防火墙/代理,套接字就足够了.
但是,由于涉及互联网(不是最快的连接),我建议为了方便起见,你应该更好地选择通过http进行远程连接.这样,即使将来设置发生变化,防火墙/代理也参与到等式中,您也不必担心.
如果您只想将原始数据从一台机器传输到另一台机器,那么使用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();
有关您的连接需求的更多信息,以便为您提供适当的解决方案.您可以使用许多协议,并且所有这些协议都需要权衡.您可能会选择以下两个传输层之一:
UDP - 这是一种发送数据包的"发送 - 忘记"方法.适用于不一定必须100%正确的流媒体.
好处:
无需连接.
很轻巧.
坏事:
不保证您的数据包到达目的地(尽管他们大多数时间都是这样做的).
数据包可以按照您发送的顺序到达.
不保证其内容与发送数据包时的内容相同.
TCP - 这是一种基于连接的协议,可保证可预测的行为.
好处:
您将确定数据包是否已到达目的地.
数据包将按您发送的顺序到达.
您可以保证99.999999999%的数据包到达时内容不会改变.
流量控制 - 如果发送数据包的机器发送得太快,接收机器可以限制发送方的数据包发送速率.
坏事:
需要建立连接.
比UDP更多的开销.
利弊列表并非完整,但它应该是足够的信息,使您能够做出明智的决定.如果可能,您应该利用已经存在的基于应用程序层的协议,例如,如果要传输ASCII文本,则使用HTTP;如果要传输文件,则使用FTP,等等.