2011-05-16 4 views
-2

Nous avons créé une socket dans une application JAVA multithread sur Windows, qui doit lire des données sous forme séquentielle. Mais nous sommes confrontés à problème dans la lecture des données de la inputstreamproblème de lecture de socket dans une application JAVA multithread

Par exemple, l'ordre des données est

1-100 (1,2,3,4,...100) 
101-200 
201-200 
and so on.. 

Nous sommes en mesure de lire 1-100 de manière séquentielle correcte, mais pas capable de lire ensemble suivant de données, à savoir 101-200. Mais peut lire d'autres ensembles de données correctement.

Les données arrivent à notre fin correctement (comme vu dans les journaux éthérés), mais le flux n'est pas en mesure de le lire.

Voici l'extrait de code

socket.getInputStream.read(buffer); 
prise

est de type classe Socket.

Quelle peut être la raison possible derrière le même? S'il vous plaît partagez votre point de vue.

+5

Je suppose que vous allez avoir besoin de poster un peu plus de code que ça ... – forsvarir

+1

multithread - cela signifie-t-il, plus d'un thread est assis sur le socket? –

+1

Pourquoi les gens capitalisent Java, je me demande ..? De toute façon, nous avons besoin de plus de code de votre part. –

Répondre

0

Voici le code snippet

> socket.getInputStream.read(buffer); 

Non, ce n'est pas. Cet extrait ne compile pas. Et l'extrait correct est trivialement évident. Les seules façons de manquer des données sont (i) si un autre thread lit le socket en même temps, ou (ii) si vous utilisez BufferedInputStream ou BufferedReader à la fois et pas à une autre.

0

Vous mentionnez ceci est une application multithread ainsi sans voir votre code mes soupçons se trouveraient dans un autre fil manipulant peut-être votre Socket ou InputStream. Les problèmes de thread peuvent être incroyablement difficiles à repérer et à déboguer.

+2

Je pense qu'il est probable que plusieurs threads essayent de lire des parties "différentes" du flux d'entrée en même temps. –

+0

@Harry, Oui, j'aurais dû être plus clair, en lisant les octets d'un InputStream, vous changez la position de lecture du flux, donc les opérations de lecture manipulent l'InputStream où les opérations peek ne le font pas. –

+0

Il n'y a pas d'opérations "peek" sur un InputStream. Je ne vois pas le but de cette réponse. Les opérations de lecture consomment l'entrée, donc c'est parti. C'est aussi simple que ça. – EJP

0

Merci pour vos commentaires. Le problème était avec la synchronisation multithreading, j'ai géré la même chose et cela a bien fonctionné.

Questions connexes