Асинхронное соединение Tcp - PullRequest
0 голосов
/ 18 июля 2011

У меня небольшая проблема, у меня есть класс 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.):)

Любая помощь, помощь будет высоко ценится (: Спасибо!

1 Ответ

1 голос
/ 18 июля 2011

пока (! Подключен) {} ??? это не способ делать что-то асинхронное. Вы загружаете процессор, ожидая, что что-то произойдет, и предотвращая это, загружая процессор. Используйте селектор или выполните подключение в режиме блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...