У меня небольшая проблема, у меня есть класс TCP, который подключается к серверу, передает данные, затем закрывается, все это работает хорошо, за исключением того, что если я подключаюсь, то остановлю его, он работает, если я продолжу делать это, онработает, но в пятый раз соединение зависает без каких-либо ошибок и не передает никаких данных .. Я не знаю, как это исправить ... Это мой код класса TCP:
package com.millennium.isynccrm.Classes;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.AsyncTask;
import android.os.CountDownTimer;
import android.util.Log;
public class TcpClient {
public static boolean connected = false;
private static Socket socket;
private static boolean pause = false;
private static SyncClient syncClient = new SyncClient();
public static int sendCount = 0;
public static int receiveCount = 0;
private static AsyncTask<?, ?, ?> sendAsyncTask;
private static AsyncTask<?, ?, ?> receiveAsyncTask;
public TcpClient() { }
public void send (String line) {
if (!connected) connect();
while (!connected) { }
sendAsyncTask = new SenderThread().execute(line);
}
public void disconnect() {
try {
if(connected == true) {
socket.close();
connected = false;
sendCount = 0;
receiveCount = 0;
if (receiveAsyncTask.getStatus().name().equals("RUNNING")) {
receiveAsyncTask.cancel(true);
}
if (sendAsyncTask.getStatus().name().equals("RUNNING")) {
sendAsyncTask.cancel(true);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void pauseReceivingForTimeInterval(int milliseconds) {
pause = true;
new CountDownTimer(milliseconds, 0) {
public void onTick(long millisUntilFinished) { }
public void onFinish() {
pause = false;
}
}.start();
}
private void connect() {
new Thread(new Runnable() {
public void run() {
try {
if (connected == false) {
socket = new Socket("192.168.1.1", 80);
connected = true;
sendCount = 0;
receiveCount = 0;
try {
if (receiveAsyncTask.getStatus().name().equals("FINISHED")) {
receiveAsyncTask = new RecieverThread().execute("");
} else if (receiveAsyncTask.getStatus().name().equals("RUNNING")) {
receiveAsyncTask.cancel(true);
receiveAsyncTask = new RecieverThread().execute("");
}
} catch (Exception e) { receiveAsyncTask = new RecieverThread().execute(""); }
}
} catch (UnknownHostException e) {
connected = false;
e.printStackTrace();
} catch (IOException e) {
connected = false;
e.printStackTrace();
}
}
}).start();
}
private static PrintWriter output;
private static BufferedReader input = null;
private class RecieverThread extends AsyncTask<String, Void, String> {
protected String doInBackground(String... line) {
while (pause) { }
try {
receiveCount++;
if (receiveCount == 1) input = new BufferedReader(new InputStreamReader(socket.getInputStream()), 8 * 1024);
return input.readLine();
} catch (IOException e) {
Log.d("error", "stop");
}
return "stop";
}
protected void onPostExecute(String result) {
if (result == null) return;
else if (!result.equals("") && !result.equals("stop")) syncClient.recieveMessage(result);
else if (!result.equals("stop")) receiveAsyncTask = new RecieverThread().execute("");
}
}
private class SenderThread extends AsyncTask<String, Void, String> {
protected String doInBackground(String... line) {
while (pause) { }
sendCount++;
if (sendCount == 1) {
try {
output = new PrintWriter(socket.getOutputStream(),true);
} catch(Exception e) { e.printStackTrace(); }
}
String msg = line[0] + "\r\n";
output.print(msg);
output.flush();
return "";
}
protected void onPostExecute(String result) {
}
}
}
Как видно, другой класс отправляет строку в этот класс для отправки на сервер, затем асинхронная задача отправляет ее, а другая асинхронная задача получает ее и передает ее в другой класс, который ее обрабатывает и т. Д.,В пользовательском интерфейсе у меня есть кнопка запуска, которая при нажатии превращается в кнопку остановки, а при нажатии кнопки остановки она вызывает здесь функцию «отключение».
Я не слишком уверен, где бы я ни делал свой RecieverThreadAsyncTask верен, он ожидает строку из сокета, затем передает ее и перезапускает сам, чтобы прослушать другую строку, это «хороший» способ сделать это?Или это ужасный путь (который я себе представляю).Честно говоря, я думаю, что этот класс очень «грязный», и я, скорее всего, буду его переделывать.
Есть предложения, почему я не могу отправлять данные при пятом подключении к серверу?(Последнее замечание: сервер здесь не виноват, так как у нас есть приложение для iPhone, которое делает то же самое) (Дополнительное примечание. Я довольно новичок в соединениях Tcp и тому подобном, и новичок в Threading /Async Tasks.):)
Любая помощь, помощь будет высоко ценится (: Спасибо!