Android - C# Файл отправки TCP - получить имя - PullRequest
0 голосов
/ 11 апреля 2020

как дела? :)
Я учусь передавать файлы через Socket, но у меня проблема. Я могу отправить файл (максимум 200 МБ) между компьютерами. Я хочу отправить файл между Android и P C. Но я не могу получить имя файла. Я имею в виду, я получил имя, но с избытком. Вместо «sample.jpg» я получил «sample.jpg ???? c [] Exif».

Итак, это мой код для Клиента на Android:

try {
            Socket sock = new Socket("192.168.1.174", 2014);

            OutputStream outputStream = null;

            File f = new File(path);

            byte[] fNameByte = name.getBytes();

            byte[] fileData = fullyReadFileToBytes(f);
            byte[] clientData = new byte[4 + fNameByte.length + fileData.length];
            byte[] fNameLen = intToByteArray(fNameByte.length);

            outputStream = sock.getOutputStream();
            FileInputStream fis = null;
            fis = new FileInputStream(f);
            BufferedInputStream bis = new BufferedInputStream(fis);
            bis.read(fileData, 0, fileData.length);

            System.arraycopy(fNameLen, 0, clientData, 0, fNameLen.length);
            System.arraycopy(fNameByte, 0, clientData, 4, fNameByte.length);
            System.arraycopy(fileData, 0, clientData, 4+fNameByte.length, fileData.length);
            outputStream.write(clientData, 0, clientData.length);

            outputStream.flush();

            sock.close();
        } catch (Exception ex) {
            Log.e("FileTransfer", "---" + ex.toString());
        }

Это мой код для Сервера на C#:

try
        {
            DebugMessage = "Starting...";
            sock.Listen(100);
            DebugMessage = "Works and waits for files";
            Socket clientSock = sock.Accept();
            byte[] clientData = new byte[1024 * 5000 * 40];//200MB
            int receivedByteLen = clientSock.Receive(clientData);
            DebugMessage = "Receiving File ...";
            int fNameLen = BitConverter.ToInt32(clientData,0);
            string fName = Encoding.ASCII.GetString(clientData, 4, fNameLen);
            debugName = fName;
            BinaryWriter write = new BinaryWriter(File.Open(path + "/" + fName, FileMode.Append));
            write.Write(clientData, 4 + fNameLen, receivedByteLen - 4 - fNameLen);
            DebugMessage = "Saving file....";
            write.Close();
            clientSock.Close();
            DebugMessage = "The file has been received";
        }
        catch (Exception e)
        {
            DebugMessage = "Error, file not received " + e.ToString() + "\n" + "Path: " + path + " ->Name: " + debugName;
        }


Это мой код для клиента в C# (работает, когда я посылаю файл между компьютерами):

try
        {
            IPAddress ip = IPAddress.Parse("192.168.1.174");
            IPEndPoint end = new IPEndPoint(ip, 2014);
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

            string path = "";
            fName = fName.Replace("\\", "/");
            while (fName.IndexOf("/") > -1)
            {
                path += fName.Substring(0, fName.IndexOf("/") + 1);
                fName = fName.Substring(fName.IndexOf("/") + 1);
            }
            byte[] fNameByte = Encoding.ASCII.GetBytes(fName);
            if (fNameByte.Length > 850 * 1024)
            {
                CurrentMessage = "The name is larger than 850 kb";
                return;
            }
            CurrentMessage = "Buffering...";
            byte[] fileData = File.ReadAllBytes(path + fName);
            byte[] clientData = new byte[4 + fNameByte.Length + fileData.Length];
            byte[] fNameLen = BitConverter.GetBytes(fNameByte.Length);
            fNameLen.CopyTo(clientData, 0);
            fNameByte.CopyTo(clientData, 4);
            fileData.CopyTo(clientData, 4 + fNameByte.Length);
            CurrentMessage = "Connecting to the server...";
            sock.Connect(end);
            CurrentMessage = "The file is sent...";
            sock.Send(clientData);
            CurrentMessage = "Disconnection...";
            sock.Close();
            CurrentMessage = "The file was sent..";
        }
        catch (Exception ex)
        {

        }

Почему это работает между компьютерами, но между Android - P C это не не работает? Спасибо за ваше время!

Редактировать: я статически назначил длину имени в файле сервера.

int fNameLen = 10;//BitConverter.ToInt32(clientData,0);

Это не решает мою проблему, но обнаруживает следующую. Он отправляет мне только 40 КБ.

...