Communication C ==> Java

Fermé
Canaboss Messages postés 49 Date d'inscription dimanche 1 juin 2008 Statut Membre Dernière intervention 22 août 2009 - 29 sept. 2008 à 07:16
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 30 sept. 2008 à 14:04
Bonjour,

dans le cadre d'un projet dans mon école, nous avons du créer un serveur et pour le tester, la prof veut qu'il soit compatible avec son client qui est codé en C ... Mon serveur est codé en Java.

Il contient notamment des méthodes ReadLine() et pour le moment c'est à ce niveau que ça bug.

Le client et le serveur arrive à se connecter et le serveur arrive ensuite à envoyer un message de bienvenue au client qui l'affiche.

Ensuite c'est au client d'entrer une ville ... mais là, le serveur ne semble pas recevoir quoi que ce soit ...
Chose étonnante que j'ai remarquée : lorsque je tape par exemple "PARIS" dans mon client, il ne se passe rien, mais si ensuite, je quitte le client de manière "brute" (Ctrl + C sous Linux) ... Le serveur réagit et continue son cycle de commandes ...

Avez vous une idée de ce qui peut se passer ? Y a t-il quelque chose de spéciale à faire pour passer d'un client en C à un serveur en Java ?

Je vous laisse le code java (la partie intéressante est en gras) :

private void Speak(Socket client, ServerSocket MyServer, Lire_fichier pointeur) throws IOException{

String LineReceived;
BufferedReader lecture = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter ecriture = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
System.out.println(MyServer.toString());

System.out.println("sending greeting message...");
ecriture.write("Bienvenue à toi\n");
ecriture.flush();
System.out.println("sended.");

while(true){
try {
System.out.println("waiting");
LineReceived = lecture.readLine();
System.out.println("and ??");
System.out.println(LineReceived);
LineReceived = pointeur.SendCityAndTime(LineReceived);
ecriture.write(LineReceived + "\n");
ecriture.flush();
if(LineReceived.equals("*")){
break;
}


}
catch (IOException e) {
e.printStackTrace();
}


et le client en C :

/* Internet Client for Phase 3 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>

#define MAXDATASIZE 100

int main(int argc, char *argv[]) {
char **p;
int port; /* port number for this connection */
int csd; /* socket descriptor for the client */
int numbytes, x, done;
u_long addr;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server_addr;
int first;

if (argc != 3) {
printf ("usage: server hostname/ip port\n");
exit(1);
}
if ((port = atoi( argv[2])) < 3000) {
printf ("port must be >= 3000\n");
exit(1);
}
/* now the user has invoked the program correctly */

if ((csd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}

/* we successfully got a socket descriptor */

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
inet_aton(argv[1], &(server_addr.sin_addr));
//server_addr.sin_addr = *((struct in_addr *)he->h_addr);
for (x = 0; x < 7; x++) server_addr.sin_zero[x] = '0';

if (connect(csd, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}
done = 0;
first = 1;
while (!done) {
if ((numbytes=recv(csd, buf, MAXDATASIZE,0)) == -1) {
perror("recv");
exit(1);
}

buf[numbytes] = '\0';

if (first == 1) {
printf("Server greeting is: %s\n", buf);
printf("Enter a city: ");
first = 0;
}
else {
if (strcmp(buf, "notfound") == 0)
printf("City was not found. \n");
else
printf("Time zone is: %s \n", buf);
printf("Enter next city: ");
}
fgets(buf, 100, stdin);
if (buf[strlen(buf)-1] == '\n') // Will be T
buf[strlen(buf)-1] = '\0'; // Get rid of newline
if(send(csd, buf, strlen(buf), 0) == -1)
perror("send");
if (strcmp(buf, "*") == 0)
done = 1;
}
close(csd);

return 0;

}

Merci d'avance !
A voir également:

3 réponses

tinoeldorados
30 sept. 2008 à 11:17
Je ne connais pas ce mode de communication.
Actuellement on utilise plutot SOAP, ou encore corba....

qu'est qu'il se passe dans ton serveur dans l'objet lecture ??
est ce que c'est toi qui l'a ecrit.
est ce que tu arrives (au debuggeur) a etre sur que tu ressors decette ligne ??

--> LineReceived = lecture.readLine();
0
Canaboss Messages postés 49 Date d'inscription dimanche 1 juin 2008 Statut Membre Dernière intervention 22 août 2009 10
29 sept. 2008 à 18:29
Personne n'a d'idées ?
-1
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
30 sept. 2008 à 14:04
Salut.
Le problème viens peut être du fait qu'en socket, pour le retour à la ligne, il faut envoyer "\r\n" et non "\n" seul.
Du coup, il est possible que le prog java attende ces deux caractère comme fin de ligne, et ne les recevant pas il ne fait rien. En revanche quand tu ferme le programme tu le force à vider ces buffer, c'est pour ça que tu reçois le message.
deux solution :
-envoie "\r\n" à la fin de l'envoie dans le programme en C.
-modifie le programme java pour recevoir des données indépendamment d'une fin de ligne (mais là je ne sais pas comment faire).
-1