将文件从Windows客户端传输到Android服务器

时间:2019-02-18 16:16:49

标签: c# android tcp file-transfer networkstream

我需要将文件从带有Windows的特定计算机传输到另一个网络上的android设备;如何识别Android服务器的IP?

你好。

所以我在Windows中有此应用程序,该应用程序从路径中获取任何文件,将其转换为byte [],连接到某个IP并通过NetworkStream发送它;

另一方面,我有一个Xamarin Android应用程序,该应用程序侦听来自任何IP的传入连接,然后将传入的字节保存到文件夹中。

它可以在本地网络上工作,但是现在我希望它可以在2个独立的网络中远程工作(例如,通过以太网连接的PC和通过4G连接的Android手机)。我假设我已经拥有Android机器的IPv4地址。

我试图四处寻找,我想我需要进行DNS查找以了解将字节发送到哪里,但是我真的不知道怎么做。

我认为我缺少关于如何转换手机IP以便Windows应用程序可以连接到它的关键步骤。我想念什么?

// Windows客户端代码 //单击按钮时发送文件

        string ipaddress = IPText.Text; //takes the written IP address
        string filepath = ApkPathText.Text; //takes the written path to the file
        Stream filestream;
        byte[] bytestream;

        try {
            filestream = File.OpenRead(filepath);
            bytestream = new byte[filestream.Length];
            filestream.Read(bytestream, 0, (int)filestream.Length);
        } catch (UnauthorizedAccessException err) {
            return;
        } catch (FileNotFoundException err) {
            return;
        } catch (IOException err) {
            return;
        }

        NetworkStream networkStream;
        TcpClient clientSocket;

        try {
            clientSocket = new TcpClient(ipaddress, 8080); //Maybe it needs a different ip??
            networkStream = clientSocket.GetStream();
            networkStream.Write(bytestream, 0, bytestream.GetLength(0));
            networkStream.Close();
        } catch (SocketException se) {
            DebugLog("Impossibile aprire socket! ["+se+"]");
            return;
        }

    }

/// Android服务器代码

public class MainActivity : AppCompatActivity
{

    private Socket client;

    private void Listener() {
        TcpListener tcpListener = new TcpListener(IPAddress.Any, 8080);
        tcpListener.Start();
        bool can_Exit = false;
        do {
            Socket socket = tcpListener.AcceptSocket();
            if (socket.Connected) {

                ThreadStart tStarter = new ThreadStart(Acceptor);
                Thread tAcceptor = new Thread(tStarter);
                tAcceptor.Start();
            }
        } while (!can_Exit);
    }

    private void Acceptor() {
        Socket socket = (Socket)client;
        NetworkStream networkStream = new NetworkStream(socket);
        int thisRead = 0;
        int blockSize = 1024;
        Byte[] dataStream = new Byte[blockSize];
        Stream fileStream = null;
        lock (this) {
            String dirPath = @"sdcard/";
            String filePath = @"file.file";
            String totalPath = dirPath + filePath;
            if (!Directory.Exists(dirPath)) {
                Directory.CreateDirectory(dirPath);
            }
            try {
                fileStream = File.OpenWrite(totalPath);
            } catch (IOException err) {
                return;
            }
            bool can_Exit = false;
            try {
                do {
                    thisRead = networkStream.Read(dataStream, 0, blockSize);
                    fileStream.Write(dataStream, 0, thisRead);
                    if (thisRead == 0) {

                        can_Exit = true;
                    }
                } while (!can_Exit);
                fileStream.Close();
            } catch (UnauthorizedAccessException err) {
                return;
            } catch (FileNotFoundException err) {
                return;
            } catch (IOException err) {
                return;
            }
        }
    }

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_main);

        ThreadStart tStarter = new ThreadStart(Listener);
        Thread tListener = new Thread(tStarter);
        tListener.Start();
    }
}

}

它应该成功连接,但是Windows客户端返回“连接尝试失败,因为连接的一方在一段时间后未正确响应,或者建立的连接失败,因为连接的主机未能响应”

1 个答案:

答案 0 :(得分:0)

所以,直接连接对我来说仍然是一个识别。所以我选择了另一种结构。

我将FTP服务器作为中间人,Android设备和PC都可以在其中连接并进行操作。

这不是最佳选择,当然也不是我一直在寻找的解决方案...但是暂时可以使用。

如果您(以后的读者)正在寻找直接连接.NET的解决方案,那么我只能指向OpenNAT和/或Windows Communication Foundation。在这两种情况下,我都可以提供可以在线使用的服务,但是该服务波动很大,对于传输大文件而言并不理想。也许仅仅是因为我不够熟练-至今。您可能会在未来的这一年更加幸运。

祝你好运,程序员!