2016-05-26 2 views
0

Мое приложение Android должно отправлять данные на сервер через сокет, а также иногда получать данные с этого сервера. Для этого я использую сервис и. Отправка данных на сервер работает нормально, я использую метод службы, который я вызываю из активности. Но при отправке работ просто отлично, мое приложение не получает никаких данных. Пока я отправляю строку «pp», я должен вернуть еще один sring с сервера, но этого просто не произойдет. Что я делаю не так?Может отправлять, но не может получать данные через сокет в моем сервисе

Моя служба:

public class MyService extends Service { 
private Socket socket; 
public static PrintWriter out; 
private BufferedReader in; 
private String line; 
private final IBinder binder = new MyBinder(); 
@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return binder; 
} 
public class MyBinder extends Binder { 
    MyService getMyService() { 
     return MyService.this; 
    } 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       InetAddress serverAddr = InetAddress.getByName("10.0.2.2"); 
       socket = new Socket(serverAddr,8998); 
       out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
         .getOutputStream())), true); 
       in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       Thread thread = new Thread(new Listener()); 
       thread.start(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 

    return START_STICKY; 
} 

private class Listener implements Runnable{ 

    @Override 
    public void run() { 
     while(true){ 
      try { 
        line = in.readLine(); 
        if(line!=null) Log.d(line,line); //never shows up in logcat 
        line=null; 

      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public void send(String line){ 
    out.println(line); 
} 
} 

И мой сервер: общественный класс Сервер {

private static final int SERVER_PORT = 8998;   
private static ServerSocket server = null; 
private static Socket client = null; 
private static BufferedReader in = null; 
private static boolean isConnected = true; 
private static String line; 

public static void main(String[] args){ 
    while(isConnected){  
     if(server==null || server.isClosed()){ 
      try{      
       server = new ServerSocket(SERVER_PORT); 
       client = server.accept(); 
       in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       System.out.println("Connected"); 
      }catch (IOException e){ 
       System.out.println("Error in opening Socket"+e); 
       System.exit(-1); 
      } 
     } 
     else{ 
      try{      
       line = in.readLine(); 

       if(line != null) 
       { 
        if(line.equals("pp")){ 
         PrintWriter out = new PrintWriter(new BufferedWriter(
           new OutputStreamWriter(client.getOutputStream())), 
           true); 
         String toSend = "String to send"; 
         out.write(toSend); 
         System.out.println("sent"); 
        } 
        System.out.println(line); 

       }else if(in.read()==-1){ 
        client.close();  
        server.close(); 
       } 


      }catch (IOException e){ 
       System.out.println("Read from client failed"); 
       System.exit(-1); 
      } 
     } 
    } 
} 



} 

ответ

1

Обычные проблемы.

  1. Вы читаете строки, но не пишите. Добавьте терминатор линии.
  2. Вы должны прекратить чтение, когда readLine() возвращает null, и закройте сокет.
  3. После того, как readLine() вернулся null, дополнительный тест чтения бессмыслен. Он всегда будет возвращать -1.
+0

спасибо. Это была такая глупая ошибка. Но почему вы говорите, что я должен закрыть розетку? Я хочу проверять данные с сервера все время – matip

+0

Если 'readLine()' возвращает null, сверстник закрыл соединение. Больше данных нет. Больше данных больше не будет. Он будет продолжать возвращать null. Немедленно. Вы будете курить процессор, ни в коем случае. Закройте гнездо и остановите чтение. – EJP

+0

Но когда я отправляю эту строку «pp» на сервер и получаю ответ, я могу сделать это снова. Это работает – matip

Смежные вопросы