从java发送int到c

问题描述:

我试图从java服务器发送5个int到c客户端。从java发送int到c

这里是我的Java代码:

class Server { 
public static void main(String args[]) throws Exception { 
ServerSocket welcomeSocket = new ServerSocket(8080); 

while(true) 
{ 
    Socket connectionSocket = welcomeSocket.accept(); 

    System.out.println("welcomeSocket.accept() called"); 
    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 

    outToClient.writeInt(1); 
    outToClient.writeInt(2); 
    outToClient.writeInt(3); 
    outToClient.writeInt(4); 
    outToClient.writeInt(5); 
    outToClient.close(); 
    connectionSocket.close(); 
} 
    } 
} 

这里是我的C代码:

// the function below is made by made, it creates and return a socket 
// AF_INET witch a tcp protocol 
int sock = socketClient("localhost",8080); 
if (sock < 0) { 
    printf("client : erreur socketClient\n"); 
    exit(2); 
} 

char intBufferCoupReq[20]; 

int data = recv(sock, intBufferCoupReq, 80, 0); 
printf("data recieved : %d\n",data); 
if(data == -1){ 
    printf("Error while receiving Integer\n"); 
} 

char intBufferCoupReq2[5][4]; 

int cpt; 
int j; 
int i = j = 0; 

// in this loop I divide my big array of 5 ints into 5 differents 
// array to use with ntohl 
for(cpt = 0; cpt < 20 ; cpt++){ 
    if(cpt%5==0) i=0; 
    if(j%4==0) j=0; 

    intBufferCoupReq2[i][j] = intBufferCoupReq[cpt]; 
    i++; 
    j++; 


} 

int receivedInt[5]; 
for(cpt=0;cpt<5;cpt++){ 
    printf("int n°%d = %d\n",cpt+1,ntohl(*((int *) &intBufferCoupReq2[cpt]))); 
} 


close(sock); 

第一次C客户机发出请求它是有点儿罚款:

data recieved : 20 
int n°1 = 4 
int n°2 = 3 
int n°3 = 2 
int n°4 = 1 
int n°5 = 5 

但第二次(没有关闭服务器)我得到这个:

data recieved : 8 
int n°1 = 16384 
int n°2 = -1610612736 
int n°3 = 11010050 
int n°4 = -1342118655 
int n°5 = 524519 

而我的java服务器崩溃与“连接重置”错误。 这两个程序运行在同一台计算机上的本地主机,端口8080.

我一直在试图弄清楚这几天,但我真的无能为力。 你们有没有得到一个建议?

非常感谢!

在你的C程序,请更换:

char intBufferCoupReq[20]; 

int data = recv(sock, intBufferCoupReq, 80, 0); 
printf("data recieved : %d\n",data); 
if(data == -1){ 
    printf("Error while receiving Integer\n"); 
} 

有了:

char intBufferCoupReq[1024]; 
memset(intBufferCoupReq, '\0', sizeof(intBufferCoupReq)); 

int k = 0; 
while (1) { 
    int nbytes = recv(sockfd, &intBufferCoupReq[k], 1, 0); 
    if (nbytes == -1) { printf("recv error\n"); break; } 
    if (nbytes == 0) { printf("recv done\n"); break; } 
    k++; 
} 

这样做是为了确保服务器发送的所有数据包都正确接收。

更新:添加代码以确认下面收到的数据。 Java程序以网络字节顺序发送整数,这需要转换为主机字节顺序。

int *myints = (int*) intBufferCoupReq; 
int i = 0; 
for (i=0; i<(k/4); i++) { 
    printf("myints[%d]=%d\n", i, ntohl(myints[i])); 
} 
+0

它的工作非常感谢。 帮了我很多。 我只有几个问题: 您将数组“intBufferCoupReq”大小设置为1024位。 它是大的方式不是吗? 是否确保数组足够长? 为什么我按顺序收到整数? (4 3 2 1 5)当我的服务器发送它的顺序(1 2 3 4 5)? 再次感谢! – Sherokan

+0

是的,最好有大的缓冲区。 1024字节(不是位)不是太大。这是为了防止服务器发生错误并发送超过缓冲区大小的预防措施。在TCP中,收到的订单必须与发送的订单相同。请再检查一次。 – tivn

+0

请参阅我的编辑,其中包含额外的代码以确认收到的数据。 – tivn