如何使用socket编程测量Android的数据包丢失? [英] How to measure Packet loss in Android using socket programming?
本文介绍了如何使用socket编程测量Android的数据包丢失?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在开发的Android应用程序,我需要从服务器通信,而我做了套接字编程的帮助,现在我需要找到丢包率在我的连接,因此没有任何 API 或任何方式找到socket编程数据包丢失。
我附上从哪里接到来自服务器的消息客户端我的code片段。
{尝试
插座=新的Socket(dstAddress,dstPort);
DataOutputStream类=新DataOutputStream类(
socket.getOutputStream());
DataInputStream以=新DataInputStream所(socket.getInputStream());
dataOutputStream.writeUTF(名);
dataOutputStream.flush(); 字符串myArray的=;
INT I = 0;
而(!goOut){
标志= 0;
如果(dataInputStream.available()大于0){
MSGLOG + = dataInputStream.readUTF();
标志= 1;
MainActivity.this.runOnUiThread(新的Runnable(){ @覆盖
公共无效的run(){
chatMsg.setText(MSGLOG);
}
}); Log.d(DERE,MSGLOG); myArray的= MSGLOG +;
Log.v(有,myArray的);
}
//Log.v(\"ARE,myArray的[0]);
如果(标志== 1)
收到(myarray的); 如果(!msgToSend.equals()){
dataOutputStream.writeUTF(msgToSend);
dataOutputStream.flush();
msgToSend =;
}
}
//Looper.loop(); }赶上(UnknownHostException异常五){
e.printStackTrace();
最后弦乐为EString = e.toString();
MainActivity.this.runOnUiThread(新的Runnable(){ @覆盖
公共无效的run(){
Toast.makeText(MainActivity.this,为EString,Toast.LENGTH_LONG).show();
} });
解决方案
检查低于code。
公共无效平()
{
字符串结果= NULL;
INT pingCount = 5;
的String [] = rttPacket新的String [3];
的String [] =丢包新的String [1];
尝试{
// URL =192.168.4.31;
字符串pingCmd =平-c+ pingCount ++ URL; // URL; //
串pingResult =;
运行R =调用Runtime.getRuntime();
进程p = r.exec(pingCmd);
在的BufferedReader =新的BufferedReader(新的InputStreamReader(
p.getInputStream()));
串inputLine;
而((inputLine = in.readLine())!= NULL){
pingResult + = inputLine;
}
附寄();
ProcessSyncResponse(pingResult,URL);
}
}公共字符串ProcessSyncResponse(字符串pingResult,字符串URL){
字符串pingdataResult = NULL;
尝试{
INT索引2 = pingResult.indexOf(%丢包);
INT索引1 = pingResult.indexOf(RTT最小/平均/最大/ MDEV =);
如果(索引1大于0){
字符串parsedTime =(pingResult.substring(索引1 + 23));
rttPacket = parsedTime.split(/);
}其他{
rttPacket [0] =0;
rttPacket [1] =0;
rttPacket [2] =0;
}
如果(索引2大于0){
串parsedPacket =;
INT finalIndex =索引2 + -3;
字符串parsedintitalIndex = pingResult.substring(finalIndex,
索引2);
parsedintitalIndex = parsedintitalIndex.replaceAll(
(,)|(,,)|(),); parsedPacket + = parsedintitalIndex;
parsedPacket + =(pingResult.substring(索引2));
丢包= parsedPacket.split(%); }其他{
丢包[0] =0;
}
}赶上(例外五){
e.printStackTrace();
}
}
log.v(TAG,丢包%+丢包[0]);
log.v(TAG,丢包AVG+ rttPacket [0]);
log.v(TAG,丢包最小+ rttPacket [1]);
log.v(TAG,丢包最大+ rttPacket [2]);
很高兴,如果它为你工作。
I am developing an application for android where i need to communicate from server and i did that with the help of socket programming, now i need to find Packet Loss in my connection, so is there any API or any way to find Packet Loss in socket programming.
I am attaching my code snippet where client received message from server.
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();
}
});
解决方案
Check below code.
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]]);
Glad if it worked for you.
这篇关于如何使用socket编程测量Android的数据包丢失?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文