Как обмениваться большими файлами между .NET и Android - PullRequest
0 голосов
/ 25 августа 2018

Я создал простое приложение на C # .net, которое делится большими файлами в папке на компьютере.Например, из одной папки в другую, используя протокол TCP / IP.Но я хочу сделать это с ПК на устройство Android, используя протокол TCP / IP.Я новичок в Java, но у меня есть некоторый опыт работы с .NET.

Вот код.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LargeFile
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void bt_send_Click(object sender, EventArgs e)
        {
            if (dlg_open_file.ShowDialog() ==System.Windows.Forms.DialogResult.OK)
            {
                String selected_file = dlg_open_file.FileName;
                String file_name = Path.GetFileName(selected_file);
                FileStream fs = new FileStream(selected_file, FileMode.Open);
                TcpClient tc = new TcpClient("127.0.0.1", 6868);
                NetworkStream ns = tc.GetStream();
                byte[] data_tosend = CreateDataPacket(Encoding.UTF8.GetBytes("125"), Encoding.UTF8.GetBytes(file_name));
                ns.Write(data_tosend, 0, data_tosend.Length);
                ns.Flush();
                Boolean loop_break = false;
                while (true)
                {
                    if (ns.ReadByte() == 2)
                    {
                        byte[] cmd_buff = new byte[3];
                        ns.Read(cmd_buff, 0, cmd_buff.Length);
                        byte[] recv_data = ReadStream(ns);
                        switch (Convert.ToInt32(Encoding.UTF8.GetString(cmd_buff)))
                        {
                            case 126:
                                long recv_file_pointer = long.Parse(Encoding.UTF8.GetString(recv_data));
                                if (recv_file_pointer != fs.Length)
                                {
                                    fs.Seek(recv_file_pointer,SeekOrigin.Begin);
                                    int temp_buff_length = (int)(fs.Length - recv_file_pointer < 20000 ? fs.Length - recv_file_pointer: 20000);
                                    byte[] temp_buff = new byte[temp_buff_length];
                                    fs.Read(temp_buff, 0,temp_buff.Length);
                                    byte[] data_to_send = CreateDataPacket(Encoding.UTF8.GetBytes("127"), temp_buff);
                                    ns.Write(data_to_send, 0,data_to_send.Length);
                                    ns.Flush();
                                    pb_upload.Value = (int)Math.Ceiling((double)recv_file_pointer / (double)fs.Length * 100);
                                }
                                else
                                {
                                    byte[] data_to_send = CreateDataPacket(Encoding.UTF8.GetBytes("128"),Encoding.UTF8.GetBytes("Close"));
                                    ns.Write(data_to_send, 0,data_to_send.Length);
                                    ns.Flush();
                                    fs.Close();
                                    loop_break = true;
                                }
                                break;
                            default:
                                break;
                        }
                    }
                    if (loop_break == true)
                    {
                        ns.Close();
                        break;
                    }
                }
            }
        }
        public byte[] ReadStream(NetworkStream ns)
        {
            byte[] data_buff = null;

            int b = 0;
            String buff_length = "";
            while ((b = ns.ReadByte()) != 4)
            {
                buff_length += (char)b;
            }
            int data_length = Convert.ToInt32(buff_length);
            data_buff = new byte[data_length];
            int byte_read = 0;
            int byte_offset = 0;
            while (byte_offset < data_length)
            {
                byte_read = ns.Read(data_buff, byte_offset,data_length - byte_offset);
                byte_offset += byte_read;
            }

            return data_buff;
        }
        private byte[] CreateDataPacket(byte[] cmd, byte[] data)
        {
            byte[] initialize = new byte[1];
            initialize[0] = 2;
            byte[] separator = new byte[1];
            separator[0] = 4;
            byte[] datalength = Encoding.UTF8.GetBytes(Convert.ToString(data.Length));
            MemoryStream ms = new MemoryStream();
            ms.Write(initialize, 0, initialize.Length);
            ms.Write(cmd, 0, cmd.Length);
            ms.Write(datalength, 0, datalength.Length);
            ms.Write(separator, 0, separator.Length);
            ms.Write(data, 0, data.Length);
            return ms.ToArray();
        }


        private void bt_start_server_Click(object sender, EventArgs e)
        {
            TCPServer obj_server = new TCPServer();
            System.Threading.Thread obj_thread = new

            System.Threading.Thread(obj_server.StartServer);
            obj_thread.Start();
        }



        class TCPServer
        {
            TcpListener obj_server;
            public TCPServer()
            {
                obj_server = new TcpListener(IPAddress.Any, 6868);
            }

            public void StartServer()
            {
                obj_server.Start();
                while (true)
                {
                    TcpClient tc = obj_server.AcceptTcpClient();
                    SocketHandler obj_handler = new SocketHandler(tc);
                    System.Threading.Thread obj_thread = new System.Threading.Thread(obj_handler.ProcessSocketRequest);
                    obj_thread.Start();
                }
            }

            class SocketHandler
            {
                NetworkStream ns;
                public SocketHandler(TcpClient tc)
                {
                    ns = tc.GetStream();
                }

                public void ProcessSocketRequest()
                {
                    FileStream fs = null;
                    long current_file_pointer = 0;
                    Boolean loop_break = false;
                    while (true)
                    {
                        if (ns.ReadByte() == 2)
                        {
                            byte[] cmd_buff = new byte[3];
                            ns.Read(cmd_buff, 0, cmd_buff.Length);
                            byte[] recv_data = ReadStream();
                            switch (Convert.ToInt32(Encoding.UTF8.GetString(cmd_buff)))
                            {
                                case 125:
                                    {
                                        fs = new FileStream(@"C:\tl\" + Encoding.UTF8.GetString(recv_data), FileMode.CreateNew);
                                        byte[] data_to_send = CreateDataPacket(Encoding.UTF8.GetBytes("126"),


                                            Encoding.UTF8.GetBytes(Convert.ToString(current_file_pointer)));
                                        ns.Write(data_to_send, 0,data_to_send.Length);
                                        ns.Flush();
                                    }
                                    break;

                                case 127:
                                    {
                                        fs.Seek(current_file_pointer,SeekOrigin.Begin);
                                        fs.Write(recv_data, 0,recv_data.Length);
                                        current_file_pointer = fs.Position;
                                        byte[] data_to_send = CreateDataPacket(Encoding.UTF8.GetBytes("126"),


                                            Encoding.UTF8.GetBytes(Convert.ToString(current_file_pointer)));
                                        ns.Write(data_to_send, 0,data_to_send.Length);
                                        ns.Flush();
                                    }
                                    break;

                                case 128:
                                    {
                                        fs.Close();
                                        loop_break = true;
                                    }
                                    break;

                                default:
                                    break;
                            }
                        }
                        if (loop_break == true)
                        {
                            ns.Close();
                            break;
                        }
                    }
                }

                public byte[] ReadStream()
                {
                    byte[] data_buff = null;

                    int b = 0;
                    String buff_length = "";
                    while ((b = ns.ReadByte()) != 4)
                    {
                        buff_length += (char)b;
                    }
                    int data_length = Convert.ToInt32(buff_length);
                    data_buff = new byte[data_length];
                    int byte_read = 0;
                    int byte_offset = 0;
                    while (byte_offset < data_length)
                    {
                        byte_read = ns.Read(data_buff, byte_offset,data_length - byte_offset);
                        byte_offset += byte_read;
                    }

                    return data_buff;
                }

                private byte[] CreateDataPacket(byte[] cmd, byte[] data)
                {
                    byte[] initialize = new byte[1];
                    initialize[0] = 2;
                    byte[] separator = new byte[1];
                    separator[0] = 4;
                    byte[] datalength = Encoding.UTF8.GetBytes(Convert.ToString(data.Length));
                    MemoryStream ms = new MemoryStream();
                    ms.Write(initialize, 0, initialize.Length);
                    ms.Write(cmd, 0, cmd.Length);
                    ms.Write(datalength, 0, datalength.Length);
                    ms.Write(separator, 0, separator.Length);
                    ms.Write(data, 0, data.Length);
                    return ms.ToArray();
                }
            }

        }
    }
}

Я считаю, что класс "TCPserver" является ответственным за получение данных.

Так что кто-нибудь может мне помочь или подсказать, как это сделать в Android.

Я успешно отправил сообщение с Android на ПК.Я также отправил некоторую текстовую строку из настольного приложения Java в настольное приложение .net, это было легко.Но застрял здесь.

Моя главная задача - отправить видеофайл с ПК на устройство и воспроизвести его на устройстве.

Любая помощь или руководство приветствуются.Дайте мне знать, если кому-то нужна дополнительная информация.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...