2015-02-12 3 views
1

Я разрабатываю приложение для Android, где мне нужно общаться с сервером, и я сделал это с помощью программирования сокетов, теперь мне нужно найти Packet Loss в моем подключении, так же есть API или любым способом для поиска потери пакетов при программировании сокетов.Как измерить потерю пакета в Android с помощью программирования сокетов?

Я прикрепляю свой фрагмент кода, где клиент получил сообщение с сервера.

try { 
     socket = new Socket(dstAddress, dstPort); 
     dataOutputStream = new DataOutputStream(
       socket.getOutputStream()); 
     dataInputStream = new DataInputStream(socket.getInputStream()); 
     dataOutputStream.writeUTF(name); 
     dataOutputStream.flush(); 

     String myArray = ""; 
     int i=0; 
     while (!goOut) { 
      flag=0; 
      if (dataInputStream.available() > 0) { 
       msgLog += dataInputStream.readUTF(); 
       flag=1; 
       MainActivity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         chatMsg.setText(msgLog); 
        } 
       }); 

      Log.d("DERE", msgLog); 

       myArray=msgLog+""; 
       Log.v("ARE", myArray); 
      } 
      //Log.v("ARE", myArray[0]); 
      if(flag==1) 
      received(myArray); 

      if(!msgToSend.equals("")){ 
       dataOutputStream.writeUTF(msgToSend); 
       dataOutputStream.flush(); 
       msgToSend = ""; 
      } 
     } 
     //Looper.loop(); 

    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
     final String eString = e.toString(); 
     MainActivity.this.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(MainActivity.this, eString, Toast.LENGTH_LONG).show(); 
      } 

     }); 
+0

Класс Socket обеспечивает связь по протоколу TCP, который является надежным и надежным. Таким образом, вам не нужно проверять потерю пакетов на уровне транспортировки. Если вы хотите проверить ответы сервера на уровне приложения, вы можете установить уникальные идентификаторы для каждого запроса, чтобы отслеживать ответы сервера. –

ответ

0

Вы можете проверить этот код.

String lost = new String();  
      String delay = new String();  
      Process p = Runtime.getRuntime().exec("ping -c 4 " + "119.147.15.13");  
      BufferedReader buf = new BufferedReader(new InputStreamReader(p.getInputStream()));  
      String str = new String();  
      while((str=buf.readLine())!=null){  
       if(str.contains("packet loss")){  
        int i= str.indexOf("received");  
        int j= str.indexOf("%");  
        System.out.println(":"+str.substring(i+10, j+1));  
//     System.out.println(":"+str.substring(j-3, j+1));  
        lost = str.substring(i+10, j+1);  
       }  
       if(str.contains("avg")){  
        int i=str.indexOf("/", 20);  
        int j=str.indexOf(".", i);  
        System.out.println(":"+str.substring(i+1, j));  
        delay =str.substring(i+1, j);  
        delay = delay+"ms";  
       }  

      }  

Источник: http://www.phonesdevelopers.com/1762932/

+0

благодарим за помощь, и есть ли какой-либо способ узнать, что мы можем измерить потерю пакетов без выполнения команды ping? – Tesy

+0

На самом деле я не знаю, как измерить потерю пакетов без пинга. но похоже, что пинг - лучший способ. –

0

Проверьте ниже кода.

public void ping() 
{ 
String result = null; 
    int pingCount=5; 
    String[] rttPacket = new String[3]; 
    String[] packetLoss= new String[1]; 
    try { 
     // url = "192.168.4.31"; 
     String pingCmd = "ping -c " + pingCount + " " + url;// url;// 
     String pingResult = ""; 
     Runtime r = Runtime.getRuntime(); 
     Process p = r.exec(pingCmd); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
      p.getInputStream())); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) { 
      pingResult += inputLine; 
     } 
     in.close(); 
     ProcessSyncResponse(pingResult, url); 
    } 
    } public String ProcessSyncResponse(String pingResult, String url) { 
    String pingdataResult = null; 
    try { 
     int index2 = pingResult.indexOf("% packet loss"); 
     int index1 = pingResult.indexOf("rtt min/avg/max/mdev ="); 
     if (index1 > 0) { 
      String parsedTime = (pingResult.substring(index1 + 23)); 
      rttPacket = parsedTime.split("/"); 
     } else { 
      rttPacket[0] = "0"; 
      rttPacket[1] = "0"; 
      rttPacket[2] = "0"; 
     } 
     if (index2 > 0) { 
      String parsedPacket = ""; 
      int finalIndex = index2 + -3; 
      String parsedintitalIndex = pingResult.substring(finalIndex, 
        index2); 
      parsedintitalIndex = parsedintitalIndex.replaceAll(
        "(,)|(,,)|()", ""); 

      parsedPacket += parsedintitalIndex; 
      parsedPacket += (pingResult.substring(index2)); 
      packetLoss = parsedPacket.split("%"); 

     } else { 
      packetLoss[0] = "0"; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
log.v(TAG," Packet Loss in %" +packetLoss[0]]); 
log.v(TAG," Packet Loss AVG" +rttPacket[0]]); 
log.v(TAG," Packet Loss Min" +rttPacket[1]]); 
log.v(TAG," Packet Loss Max" +rttPacket[2]]); 

Рад, если это сработает для вас.

+0

спасибо 4 помощь, которая мне очень помогает, и я заинтересован в том, чтобы найти потерю пакетов, не используя команду ping, поэтому помогите мне, если вы знаете какой-либо способ сделать это. – Tesy

+0

Вы можете сделать это с помощью ipconfig/ping. Помимо этого я понятия не имею. Это может помочь вам http://stackoverflow.com/questions/3211088/how-to-calculate-packet-loss-jitter-and-qos-parameters-of-video-over-an- ф-сопп – Madhukar