обмен файлами по TCP
Добавлено: 04 сен 2017, 16:26
Есть рабочий клиент на андроид. 4 кнопки.
1.Установить соединение
2.Обмен данными.
3.Сохранить файлы
4.Закрыть соединение.
Помогите объединить эти процессы под одну кнопку.
Activity
класс TCPSocket
класс FilesApp
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;
}
}