2013-05-04 74 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