обмен файлами по TCP

Ответить
Николай Пряхин
Сообщения: 1
Зарегистрирован: 04 сен 2017, 15:48

обмен файлами по TCP

Сообщение Николай Пряхин » 04 сен 2017, 16:26

Есть рабочий клиент на андроид. 4 кнопки.
1.Установить соединение
2.Обмен данными.
3.Сохранить файлы
4.Закрыть соединение.
Помогите объединить эти процессы под одну кнопку.
Activity

Код: Выделить всё

public class SyncActivity extends AppCompatActivity {
    private Button mButtonOpen  = null;
    private Button mButtonSend  = null;
    private Button mButtonGet  = null;
    private Button mButtonClose = null;
    private Button mButtonOpenF  = null;
    private Button mButtonSaveF = null;
    private Button mButtonOpenList = null;
    private TCPSocket mServer = null;
    private FilesApp mFiles = null;
    private TextView tvMessage;
    private String strMessage = "";
    private String strData;
    private String strUser = "1111111";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sync);

        mButtonOpen = (Button) findViewById(R.id.button_open_connection);
        mButtonSend = (Button) findViewById(R.id.button_send_connection);
        mButtonGet = (Button) findViewById(R.id.button_get_connection);
        mButtonClose = (Button) findViewById(R.id.button_close_connection);
        mButtonOpenF = (Button) findViewById(R.id.button_open_file);
        mButtonSaveF = (Button) findViewById(R.id.button_save_file);
        mButtonOpenList = (Button) findViewById(R.id.button_open_list);
        mButtonSend.setEnabled(false);
        mButtonGet.setEnabled(false);
        mButtonClose.setEnabled(false);
        tvMessage = (TextView) findViewById(R.id.textView_Message);

        //scroll по TextView
        tvMessage.setMovementMethod(new ScrollingMovementMethod());

        //открываем соединение
        mButtonOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                connectServer();
            }
        });

        //кнопка передаем и получаем данные
        mButtonSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendFiles();
                getFiles();
            }
        });

        //закрываем соединение
        mButtonClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /* Закрываем соединение */
                mServer.closeConnection();
                /* устанавливаем неактивными кнопки отправки и закрытия */
                mButtonSend.setEnabled(false);
                mButtonGet.setEnabled(false);
                mButtonClose.setEnabled(false);
                strMessage = strMessage + "Соединение закрыто.\n";
                tvMessage.setText(strMessage);
            }
        });

        //сохраняем файл
        mButtonSaveF.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveFiles();
            }
        });

    //отправка файлов
    private void connectServer() {
        /* создаем объект для работы с сервером*/
        mServer = new TCPSocket();
        /* Открываем соединение. Открытие должно происходить в отдельном потоке от ui */
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    mServer.openConnection();
                    /**
                     устанавливаем активные кнопки для отправки данных
                     и закрытия соедиения. Все данные по обновлению интерфеса должны
                     обрабатывается в Ui потоке, а так как мы сейчас находимся в
                     отдельном потоке, нам необходимо вызвать метод  runOnUiThread()
                     */
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mButtonSend.setEnabled(true);
                            mButtonGet.setEnabled(true);
                            mButtonClose.setEnabled(true);
                            strMessage = strMessage + "Соединение установлено.\n";
                        }
                    });
                } catch (Exception e) {
                    strMessage = strMessage + "Ошибка соединения: " + e.getMessage() + "\n";
                    mServer = null;
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvMessage.setText(strMessage);
                    }
                });
            }
        }).start();
    }

    //отправка файлов
    private void sendFiles() {
        if (mServer == null) {
            Log.e(mServer.LOG_TAG, "Сервер не создан");
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    /* отправляем на сервер данные */
                    String strFile = strUser + "<IDUser>" +
                            "<EOF>" + "\n";
                    mServer.sendData(strFile.getBytes());
                    strMessage = strMessage + "Файлы успешно отправлены." + "\n";
                } catch (Exception e) {
                    strMessage = strMessage + "Ошибка отправки файлов: " + e.getMessage() + "\n";
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvMessage.setText(strMessage);
                    }
                });
            }
        }).start();
    }

    //получение файлов
    private void getFiles() {
        if (mServer == null) {
            Log.e(mServer.LOG_TAG, "Сервер не создан");
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    /* получаем данные с сервера */
                    strData = mServer.getData();
                    strMessage = strMessage + "Файлы успешно получены.\n";
                } catch (Exception e) {
                    strMessage = strMessage + "Ошибка получения файлов: " + e.getMessage() + "\n";
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvMessage.setText(strMessage);
                    }
                });
            }
        }).start();
    }

    private void saveFiles() {
        try {
            String fileNumber = "<EndFile>";
            String[] splitFileNumber = strData.split(fileNumber);
            String fileName = "<Start>";
            String[] splitFileName = splitFileNumber[0].split(fileName);

            if (mFiles.writeFile(this, splitFileName[1], splitFileName[0]) == true) {
                strMessage = strMessage + "Файл " + splitFileName[0] + " сохранен.\n";
            } else {
                strMessage = strMessage + "Ошибка. Файл " + splitFileName[0] + " не сохранен.\n";
            }
            tvMessage.setText(strMessage);

        } catch (Throwable t) {
            strMessage = strMessage + "Ошибка сохранения файла: " + t.toString();
        }
        tvMessage.setText(strMessage);
    }


}
класс TCPSocket

Код: Выделить всё

public class TCPSocket {
    public static final String LOG_TAG = "myServerApp";
    // ip адрес сервера, который принимает соединения
    private String mServerName = "11.11.11.11";
    // номер порта, на который сервер принимает соединения
    private int mServerPort = 11111;
    // сокет, через которий приложения общается с сервером
    private Socket mSocket = null;

    public TCPSocket() {}


    /** Открытие нового соединения. Если сокет уже открыт, то он закрывается.
     * @throws Exception
     * Если не удалось открыть сокет */
    public void openConnection() throws Exception {
        /** Освобождаем ресурсы */
        closeConnection();
        try {
            /** Создаем новый сокет. Указываем на каком компютере и порту запущен наш процесс,
             который будет принамать наше соединение. */
            mSocket = new Socket(mServerName,mServerPort);
        } catch (IOException e) {
            throw new Exception("Невозможно создать сокет: "+e.getMessage());
        }
    }

    /** Метод для закрытия сокета, по которому мы общались. */
    public void closeConnection() {
        /** Проверяем сокет. Если он не зарыт, то закрываем его и освобдождаем соединение.*/
        if (mSocket != null && !mSocket.isClosed()) {
            try {
                mSocket.close();
            } catch (IOException e) {
                Log.e(LOG_TAG, "Невозможно закрыть сокет: " + e.getMessage());
            } finally {
                mSocket = null;
            }
        }
        mSocket = null;
    }

    /** Метод для отправки данных по сокету.
     * @param data
     * Данные, которые будут отправлены
     * @throws Exception
     * Если невозможно отправить данные */
    public void sendData(byte[] data) throws Exception {
        /** Проверяем сокет. Если он не создан или закрыт, то выдаем исключение */
        if (mSocket == null || mSocket.isClosed()) {
            throw new Exception("Невозможно отправить данные. Сокет не создан или закрыт");
        }
        /** Отправка данных */
        try {
            mSocket.getOutputStream().write(data);
            mSocket.getOutputStream().flush();
        } catch (IOException e) {
            throw new Exception("Невозможно отправить данные: "+e.getMessage());
        }
    }

    /** Метод для получения данных по сокету.
     * Данные, которые будут получены
     * @throws Exception
     * Если невозможно получить данные */
    public String getData() throws Exception {
        /** Проверяем сокет. Если он не создан или закрыт, то выдаем исключение */
        if (mSocket == null || mSocket.isClosed()) {
            throw new Exception("Невозможно получить данные. Сокет не создан или закрыт");
        }
        try {
            /** получение данных */
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(mSocket.getInputStream()));
            String line;
            StringBuilder builder = new StringBuilder();
            while ((line = br.readLine()) != null) {
                builder.append(line + "\n");
            }
            String msg = builder.toString();
            return msg;
        } catch (IOException e) {
            throw new Exception("Невозможно получить данные: "+e.getMessage());
        }
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        closeConnection();
    }

}
класс FilesApp

Код: Выделить всё

public class FilesApp {
    public FilesApp() {}

    public static boolean writeFile(Context context, String strContent, String fileName) {
        boolean bReturn = true;
        OutputStreamWriter osw = null;
        try {
            // ??????
            osw = new OutputStreamWriter(context.openFileOutput(fileName, context.MODE_PRIVATE));
            osw.write(strContent);
            osw.flush();
        } catch (Exception e) {
            e.printStackTrace();
            bReturn = false;
        } finally {
            try {
                osw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bReturn;
    }

    public static String readFile(Context context, String fileName) {
        String strValue = null;
        File file = context.getFileStreamPath(fileName);
        if (file.exists()) {
            StringBuilder sb = new StringBuilder();
            BufferedReader bufferReader = null;
            try {
                // ?????????????buffer??
                bufferReader = new BufferedReader(new InputStreamReader(
                        context.openFileInput(fileName)));
                String strLine = null;
                while ((strLine = bufferReader.readLine()) != null) {
                    sb.append(strLine);
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bufferReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            strValue = sb.toString();
        }
        return strValue;
    }

}

Ответить