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);
}
}
Код: Выделить всё
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();
}
}
Код: Выделить всё
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;
}
}