2011-03-23 21 views
0
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(); 
} 

}的ServerSocket中的onCreate听使“超时创建服务”异常

回答

0

由于服务器是在主线程监听,方法onCreate没有完成,直到服务器得到与客户端的一些连接,您请在onCreate超时。为避免这种情况,请在另一个线程中运行服务器。

要读取的缓冲区,而不是由readline,你可以做到以下几点:

char buff = new char[MAX_PACKET_SIZE]; 
BufferedReader br = new BufferedReader(new InputStream(socket.getInputStream())); 
br.read(buff); 
+0

是啊......我只是没现在一样...顺便感谢好友... – 2011-03-23 13:25:38

+0

...你知道还有其他方法可以做读取线以外的缓冲读取吗?因为它期望一个行终止符.. – 2011-03-23 13:26:51

+0

当然,请参阅编辑的答案。 – MByD 2011-03-23 13:32:41