2013-05-04 75 views
-1

我想从Java服务器向C客户端发送整数和字符串。我可以读取整数,但读取字符串时遇到问题。这是Java无法通过套接字接收字符串

ClientNumber++; 
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
//dos.flush(); 
dos.writeInt(ClientNumber); 

String randomString= getRandomValue(10,20); 
dos.writeUTF(randomString); 

这是C客户端代码我的服务器代码:

int to_server_socket = -1; 

void main (void) 
{ 

    char *server_name = SERVEURNAME; 
    struct sockaddr_in serverSockAddr; 
    struct hostent *serverHostEnt; 
    long hostAddr; 
    long status; 
    char buffer[512]; 

    bzero(&serverSockAddr,sizeof(serverSockAddr)); 
    hostAddr = inet_addr(SERVEURNAME); 
    if ((long)hostAddr != (long)-1) 
     bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr)); 
    else 
    { 
     serverHostEnt = gethostbyname(SERVEURNAME); 
     if (serverHostEnt == NULL) 
     { 
      printf("gethost rate\n"); 
      exit(0); 
     } 
     bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length); 
    } 
    serverSockAddr.sin_port = htons(8071); 
    serverSockAddr.sin_family = AF_INET; 

    /* creation de la socket */ 
    if ((to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0) 
    { 
     printf("creation socket client ratee\n"); 
     exit(0); 
    } 
    /* requete de connexion */ 
    if(connect(to_server_socket, 
       (struct sockaddr *)&serverSockAddr, 
       sizeof(serverSockAddr)) < 0) 
    { 
     printf("demande de connection ratee\n"); 
     exit(0); 
    } 
    /* envoie de donne et reception */ 

    int value = htonl(6); 
    int reply = 0; 

    if(send(to_server_socket, &value, sizeof(value), 0) != sizeof(value)) 
    { 
     printf("socket write failed"); 
     exit(-1); 
    } 

    if(recv(to_server_socket, &reply, sizeof(reply), MSG_WAITALL) != sizeof(reply)) 
    { 
     printf("socket read failed"); 
     exit(-1); 
    } 

    printf("got reply: %d\n", ntohl(reply)); 

    char myString[30] = ""; 
    ssize_t nbytes=0; 

    if ((nbytes = recv(to_server_socket, myString, sizeof(myString), 0)) < 0) 
    { 
     perror("recv"); 
     exit(1); 
    } 
    myString[nbytes - 1] = '\0'; 


    printf("Recived String : %s",myString); 


} 

结果我得到了我的号码,然后“套接字读取失败的字符串”的消息。 如果我不这样做测试过我没有任何结果

char myString[20] = ""; 
    recv(to_server_socket, &myString, sizeof(myString), 0); 
+0

您可以使用WireShark或其他软件监视网络流量,并检查字符串是否正确传递? – Pietu1998 2013-05-04 12:08:57

+0

与java客户端它的工作完美 – user2328999 2013-05-04 12:10:41

+0

您的错误检查不_look_有效的字符串大小写。为什么发送的字符串长达30个字符? – Mat 2013-05-04 12:10:48

回答

0

麻烦的是与以下行:

char myString[30] = ""; 

if(recv(to_server_socket, &myString, sizeof(myString), 0) != sizeof(myString)) 

你确定你是从Java发送串是30个字符。在上面的行中,您正在检查recv的返回值以查看值是否为30,但情况可能并非如此。

只需打印recv的返回值并查看它是否获取任何数据以及该数据中存在多少个字符。

+0

不,它是一个随机的字符串,介于10和20之间,最多为30,最多为 – user2328999 2013-05-04 12:15:09

+0

但是,如果它是一个10到20个字符之间的随机字符串,然后最多只能有20个字符。所以,recv函数将只接收20个字符,所以,条件将失败。所以,我想现在,你必须清楚这个问题。 – Jay 2013-05-04 12:16:47

+0

我用20试过了,它不起作用,所以我想用30,因为有可能在字符串C中的其他一些caracther像字符串末尾的\ 0 – user2328999 2013-05-04 12:19:36