我想在Android设备中计算上传速度。为此,我创建了一个套接字服务器,我通过socket从我的Android设备发送1 MB数据。通过将字节数除以计算上传速度的时间。
面临的问题是,当我使用1 MB数据计算上传速度时,它几乎是使用1/2 MB数据计算的1.5倍。我无法找到问题。
这是我用C计算上传速度的代码。这是1MB数据。对于1/2 MB数据,我只需将字节更改为524288,并且从Android发送时也是如此。
int sock = *(int*)socket_desc;
int read_size;
char client_message[1048576];//1048576
int rc = 0;
int temp;
double Bandwidth;
int result[1];
double t;
struct timeval tv1, tv2;
read_size = 0;
temp = 0;
gettimeofday(&tv1, NULL);
read_size = recv(sock , client_message ,sizeof(client_message), 0);
if(read_size < (1048576)){
read_again1: temp = read_size;
read_size = 0;
read_size = recv(sock , client_message+temp , (sizeof(client_message)-temp), 0);
read_size+=temp;
temp=0;
if(read_size < (1048576))
goto read_again1;
}
gettimeofday(&tv2, NULL);
t = (double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
(double) (tv2.tv_sec - tv1.tv_sec);
read_size*=8;
read_size/=1024;
Bandwidth = read_size/t;
result[0]= (int) Bandwidth;
rc = send(sock , result , 4, 0);
read_size = recv(sock , client_message ,1024, 0);
if(read_size == 0){
exit_thr = 1;
rc = close(sock);
pthread_exit(&exit_thr);
}
else if(read_size == -1){
rc = close(sock);
pthread_exit(&exit_thr);
}
这是我的Android端代码:
byte buffer[] = new byte[1048576];
byte recvBuff[] = new byte[4];
String strHexNumber, strHexNumber1= "";
for(i=0;i<1048576;i++)
buffer[i] = (byte)i;
try {
bandwidth = 0;
strHexNumber = strHexNumber1 ="";
InetAddress addr = InetAddress.getByName("52.28.xxx.xx");
Socket socket = new Socket();
socket.connect(new InetSocketAddress(addr,8xxx));
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(buffer);
BufferedInputStream bos1 = new BufferedInputStream(socket.getInputStream());
bos1.read(recvBuff,0,4);
在上面的代码中,可能会丢失一些大括号。此代码仅包含带宽的处理部分,其他部分类似于连接接受被省略
答案 0 :(得分:1)
在您的Java代码中,您假设read()填充缓冲区,并且您没有检查它返回-1。
在您的C代码中,您不会检查recv()返回-1还是零。这段代码令人难以置信的复杂,看到它所要做的就是读取固定数量的字节。循环后最终读取的目的完全逃脱了我。