Прослушивание ServerSocket в onCreate вызывает исключение «Служба создания тайм-аута» - PullRequest
0 голосов
/ 23 марта 2011
public class BackgroundService extends Service{
ServerSocket server = null;
Socket socketClient = null;

private static final String TAG = BackgroundService.class.getSimpleName();
Thread socketThread;
int temp =0;

@Override
public IBinder onBind(Intent intent) {
    if (BackgroundService.class.getName().equals(intent.getAction())) {
        Log.d(TAG, "Bound by intent " + intent);
        return apiEndpoint;
    } else {
        return null;
    }
}

private final Object latestIncomingMessage = new Object();
private List<MessageCollectorListener> listeners = new ArrayList<MessageCollectorListener>();
private Message message = new Message(" ");

private MessageCollectorApi.Stub apiEndpoint = new MessageCollectorApi.Stub() {
    @Override
    public void removeListener(MessageCollectorListener listener) throws RemoteException {
        synchronized (listener) {
            listeners.remove(listener);
        }
    }

    @Override
    public Message getValue() throws RemoteException {
        synchronized (latestIncomingMessage) {
            return message;
        }
    }

    @Override
    public void addListener(MessageCollectorListener listener) throws RemoteException {
        synchronized (listener) {
            listeners.add(listener);
        }
    }
};

@Override
public void onCreate() {
    super.onCreate();
    socketThread = new Thread() 
    {
        @Override
        public void run() 
        {
            try {
                server = new ServerSocket(8080);
            } catch (IOException e2) {
                e2.printStackTrace();
            };

            while(true){
                try {
                    socketClient = server.accept();
                    InputStream is = socketClient.getInputStream();
                    DataOutputStream os = new DataOutputStream(socketClient.getOutputStream());
                    InputStreamReader isr = new InputStreamReader(is);
                    char[] buff = new char[10];
                    BufferedReader br = new BufferedReader(isr);
                    br.read(buff);
                    synchronized (latestIncomingMessage) {
                        message.setValue(String.valueOf(buff));
                    }
                    synchronized (listeners) {
                        for (MessageCollectorListener listener : listeners) {
                            try {
                                listener.handleUpdatedMessages();
                            } catch (RemoteException e) {
                                Log.w(TAG, "Failed to notify listener " + listener, e);
                            }
                        }
                    }
                   buff = new char[10];
                } catch (IOException e1) {
                    e1.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };
    socketThread.start();
}

@Override
public void onDestroy() {
    super.onDestroy();
    socketThread.destroy();
}

}

1 Ответ

0 голосов
/ 23 марта 2011

Поскольку сервер прослушивает основной поток, метод onCreate не завершается, пока сервер не установит какое-либо соединение с клиентом, и вы не получите время ожидания на onCreate. Чтобы избежать этого, запустите сервер в другом потоке.

Чтобы прочитать буфер, а не readline, вы можете сделать следующее:

char buff = new char[MAX_PACKET_SIZE];
BufferedReader br = new BufferedReader(new InputStream(socket.getInputStream()));
br.read(buff);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...