Python сервер сокетов неправильно отправляет файл базы данных - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь передать файл базы данных с моего python сервера (P C) своему java клиентскому приложению (Android -studio) с помощью сокетов. Я смог передать файлы без каких-либо проблем, но когда Я передаю файл своей базы данных, я просто не могу его использовать android студия выдает эту ошибку:

(11) malformed database schema (?)
E/DefaultDatabaseErrorHandler: Corruption reported by sqlite on database: /data/user/0/com.example.serverclient/databases/trempi.db
    deleting the database file: /data/user/0/com.example.serverclient/databases/trempi.db
**`Server(Python)`**
here is my python server:
import socket
TCP_IP = '192.168.14.87'
TCP_PORT = 9012
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(5)
print ('listening')
conn, addr=s.accept()
print ("Client connected: ",addr)
filename="trempi.db"
file=open(filename, 'rb')
file_data=file.read(4096)
conn.send(file_data)
print ("Data has been transmitted :)")

    **Client(Android-Studio)**
    and here is my MainActivity in android studio:
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv=findViewById(R.id.tv1);
            btn=findViewById(R.id.btn);
            btn.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            Thread myThread=new Thread(new MyServer());
            myThread.start();

        }
        class MyServer implements Runnable
        {
            Handler handler=new Handler();
            @Override
            public void run() {
                try {
                    byte[] b=new byte[100000];
                    Socket s=new Socket("192.168.14.87",9012);
                    InputStream is=s.getInputStream();

                    FileOutputStream fr=new FileOutputStream(getDatabasePath("trempi.db").toString());
                    is.read(b,0,b.length);
                    fr.write(b,0,b.length);
                    s.close();
                    is.close();
                    fr.close();
                    Intent go=new Intent(MainActivity.this,Data.class);
                    startActivity(go);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

1 Ответ

0 голосов
/ 27 мая 2020

Сравните длины исходного файла базы данных и полученного файла. Если ваш исходный файл не превышает 4096 байт, file.read(4096) считывает только первую часть базы данных, и вы получаете усеченный поврежденный файл. Попробуйте вместо этого file.read().

поврежденный файл на 4 КБ меньше исходного файла

Теперь, когда ошибка на сервере Python исправлена, осталась одна в клиенте приложения Java: поскольку чтение сокета может возвращать только часть отправленных данных за раз, недостаточно вызвать read только один раз; поэтому измените

                    is.read(b,0,b.length);
                    fr.write(b,0,b.length);

на

                    int len;
                    while ((len = is.read(b, 0, b.length)) > 0) fr.write(b, 0, len);
...