2010-11-14 24 views
1

J'essaie d'écrire un client pour Android qui est censé communiquer avec l'application serveur PC sur le réseau local. L'application serveur est écrite par mon ami en C#. Actuellement, il existe une application iPhone qui utilise cette application serveur sans problèmes.Problème TCP - se bloque lors de la lecture de la réponse du serveur

J'ai très simple code client TCP:

1. Socket s = new Socket(server, port); 
2. OutputStream out = s.getOutputStream(); 
3. PrintWriter output = new PrintWriter(out); 
4. output.println("ACTION=Next&VALUE=0&"); 
5. BufferedReader input = new BufferedReader(new nputStreamReader(s.getInputStream())); 
6. String st = input.readLine(); 

Je suis passé par de nombreux exemples de mise en œuvre de TCP, et ils sont tous semblables. Assez comme mon code ci-dessus. Mon application se bloque à la ligne 6 lorsque j'essaie de lire la réponse du serveur. Il ne provoque pas d'erreurs (aucune exception), rien ne s'affiche dans le débogueur, juste une erreur de délai après un certain temps. Le serveur est supposé renvoyer une chaîne après l'exécution de mon action à la ligne 4. Je ne comprends pas pourquoi ce code se bloque. L'entrée n'est pas NULL (je l'ai vérifié). Je m'attendrais à ce qu'une exception soit lancée ou simplement une chaîne vide à renvoyer.

Alors? Qu'est-ce que je rate? Pourrait-il être un problème avec certains caractères spéciaux que l'application du serveur envoie et Android ne peut pas gérer cela? Ai-je besoin d'une autorisation spéciale dans mon manifeste?

Je suis certain que j'ai une adresse IP correcte et un numéro de port correct. Je peux voir cela sur l'application serveur fonctionnant sur mon PC.

Merci.

+0

Est-ce que readLine() attend un caractère de retour à la ligne? Le serveur est-il censé envoyer une nouvelle ligne? – Slartibartfast

+0

Merci. C'était l'un des problèmes. En tant qu'auteur d'application de serveur de terminaison de message, utilisez la séquence . Il s'est avéré qu'il y avait plus d'un problème. Dans la ligne 4, j'ai dû remplacer tous les caractères & & mais ce n'était pas la solution. Il semble que PrintWriter ajoute quelque chose à OutputStream, probablement \ n caractère ou quelque chose de similaire. Le serveur n'a pas aimé cela et mes actions ont été ignorées. J'ai essayé PrintStream au lieu de PrintWriter et cela a fonctionné parfaitement. – bobetko

Répondre

0

Vous avez bien sûr besoin d'une autorisation Internet dans le manifeste.

Si c'était moi j'ajouterais l'instrumentation au serveur de sorte qu'il puisse vous indiquer quand il y a eu une connexion, quand cette connexion a reçu des données, et quand une réponse est envoyée. Ou bien exécutez tcpdump sur le serveur.

Vous pouvez également essayer temporairement de saisir le caractère d'entrée par caractère plutôt que par une ligne entière à la fois.

Essayez de savoir dans quelle mesure la « conversation » progresse, vous pouvez donc savoir où il est vraiment coincé

+0

J'avais cet ensemble de permissions. Comme je l'ai dit plus haut, le pire était que le serveur ignorait mon message et n'envoyait aucune réponse. Quand j'ai réussi à obtenir quelque chose en réponse, j'ai pu me reposer. Je vais vérifier le programme tcpdump. Je n'ai jamais travaillé sur quelque chose comme ça avant. Ce serait utile si je le savais avant. Merci. – bobetko

+0

êtes-vous résoudre ce problème, alors vous devez spécifier le problème et donner resion et répondre s'il vous plaît je suis confronté au même problème –

+0

Monsieur s'il vous plaît me revenir dès que possible j'attends votre précieuse réponse merci d'avance –

1

chaîne st = input.readLine(); Est-ce que cette commande fait attendre le programme jusqu'à ce que quelque chose soit en cours de lecture ou il prend juste tout ce qui est dans le tampon. Je suppose que vous devrez vérifier continuellement si quelque chose vient du serveur. Je veux dire, vous avez besoin d'une boucle infinie, quelque chose comme While (True){ st = input.readLine(); Cela va vérifier si quelque chose est venu tout le temps. Si vous ne l'utilisez pas et si String st = input.readLine(); commande ne fait pas attendre le programme, alors votre code se terminera sans rien prendre.