gpt4 book ai didi

java - 套接字通信中客户端接收到错误数据

转载 作者:行者123 更新时间:2023-11-30 19:42:31 25 4
gpt4 key购买 nike

我正在开发一个小项目来确定网络的上传速度。我用 C 创建了一个小型服务器,它根据客户端发送的 1 MB 数据所花费的时间来计算上传速度。

这是我的服务器代码 C:

void main(int argc, char** argv){

int sock_desc = 0;
int connfd = 0;
int read_size = 0;
int clntSock;
struct sockaddr_in serv_addr;
struct sockaddr_in echoClntAddr;
int rc;
char client_message[1048576];//1048576 //524288
time_t start,end;
double t;
int temp;
double Bandwidth;
int result[1];


struct timeval tv1, tv2;

sock_desc = socket(AF_INET, SOCK_STREAM, 0);

if(sock_desc < 0 )
dieWithError("Unable to open Socket\n");

memset(&serv_addr,0,sizeof(serv_addr));

serv_addr.sin_family = AF_INET ;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(7024);

if(bind(sock_desc, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
dieWithError("bind failed\n");


if(listen(sock_desc,MAX_CONNECTIONS) < 0)
dieWithError("listen failed\n");

clntSock = sizeof(struct sockaddr);
bahar:
connfd = accept(sock_desc, (struct sockaddr *)&echoClntAddr,(socklen_t*)&clntSock);
printf("Connection accepted\n");
while(1){

read_size = recv(connfd , client_message ,1, 0);
gettimeofday(&tv1, NULL);
if(read_size < 1048576)
read_again: temp = read_size;
read_size = 0;
read_size = recv(connfd , client_message+temp , (sizeof(client_message)-temp), 0);
read_size+=temp;
printf("read size is %d\n",read_size);
temp=0;

if(read_size < 1048576)//524288
goto read_again;


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;
// Bandwidth/=1024;
printf("Network Bandwidth is %d Kbps\n",result[0]);//Bandwidth);
rc = send(connfd , result , 4, 0);//send Bandwidth to client
goto bahar;

}

}



void dieWithError(char *errormsg){
printf("%s", errormsg);
}

这是我的 Java 客户端代码:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

public class JavaSAmpleClient {

public static void main(String[] args)throws IOException {
int i;
int arr[] = new int[10];
byte bfr[] = new byte[1024*1024];
for (i=0;i<1048576;i++)
bfr[i] = (byte)i;

Socket s1 = new Socket("127.0.0.1",7024);


BufferedOutputStream bos = new BufferedOutputStream(s1.getOutputStream());
BufferedInputStream bos1 = new BufferedInputStream(s1.getInputStream());
bos.write(bfr);
i= bos1.read();//read bandwidth returned by server
System.out.println(i);

}

}

面临的问题是,如果我用 C 编写客户端程序,它能够正确接收上传速度。但如果使用 Java,我就无法得到正确的结果。

例如:如果是java客户端:如果服务器发送带宽为 4282279,Java 客户端接收到的带宽为 167。

如果是 C 客户端:如果服务器发送带宽为 4282279,客户端接收的带宽为 4282279。

我无法用 C 语言进行客户端编程,因为我需要在 Android 上运行客户端应用程序。

最佳答案

您的 C 发送代码中存在字节顺序问题,而 Java 代码中存在 read() 编码问题。

  1. 您需要以网络字节顺序发送 int。在 C 代码中使用 result[0] = htonl(Bandwidth);
  2. 您正在读取一个字节而不是 4 字节整数。将 DataInputStream 包裹在 BufferedInputStream 周围,并调用 readInt()

关于java - 套接字通信中客户端接收到错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31769905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com