Передача файла с клиента Windows на сервер Android - PullRequest
0 голосов
/ 18 февраля 2019

Мне нужно перенести файл с определенного компьютера с Windows на устройство Android в другой сети;Как я могу узнать IP-адрес сервера Android?

Привет.

Итак, у меня есть это приложение в Windows, которое берет любой файл из пути, преобразует его в байт [], подключается к определенному IPи отправляет его с NetworkStream;

на другом конце У меня есть приложение Xamarin для Android, которое прослушивает входящие соединения с любого IP, а затем сохраняет входящие байты в папке.

Работает налокальная сеть, но теперь я хочу, чтобы она работала удаленно в 2 отдельных сетях (скажем, ПК, подключенный через Ethernet, и телефон Android, подключенный через 4G).Я работаю в предположении, что у меня уже есть IPv4-адрес компьютера Android.

Я попытался найти его и думаю, что мне нужно выполнить поиск 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 голосов
/ 09 мая 2019

Итак, прямое соединение для меня все еще является incognita .Поэтому я выбрал другую структуру.

Я поставил FTP-сервер в качестве посредника, где и устройство Android, и ПК могут подключаться и выполнять операции.

Это не такоптимальное, и, конечно, не то решение, которое я искал ... но пока оно работает.

Если вы, читатель из будущего, ищете решение с прямым подключением в .NET, я могу тольконаправить вас к OpenNAT и / или Windows Communication Foundation.В обоих случаях мне удалось создать службу, доступную в Интернете, но она сильно колебалась и не была идеальной для передачи больших файлов.Может быть, это только потому, что я недостаточно квалифицирован - пока.Возможно, вам больше повезет в футуристическом году, в котором вы оказались.

Удачи, программист!

...