2009-05-18 16 views
3

J'utilise la classe Java SocketChannel pour une application client/serveur. Je peux envoyer et récupérer des données. Mais si mes données contiennent '\n' alors je ne lis pas les données correctes. Par exemplecomment envoyer puis lire n en utilisant SocketChannel en Java

sending data = "Hi dear" 
receiving data = "Hi dear" 

sending data = "Hi dear\n\n i am fine" 
receiving data = "Hi dear" 

sending data = "Hi dear\\n\\n i am fine" 
receiving data = "Hi dear\n\n i am fine" 


ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE); 
int nbytes = socketChannel.getChannel().read(byteBuffer); 

J'utilise le décodage US-ASCII. Comment puis-je surmonter ce type de problème?

Merci, Deepak

Répondre

0

Je pense que vous rencontrez un problème avec le ByteBuffer sur l'allocation.

J'ai déjà eu des problèmes avec SocketChannel où les données semblaient être bloquées. Je recommande de faire quelques sysouts sur ByteBuffer

while(ByteBuffer.hasRemaining(){ 
    socketChannel.write(buffer) //writing data 
    System.out.printline(socketChanel.remaining() + " : bytes to go"); 
} 

Cela peut être un pas dans la bonne direction pour isoler la question.

1

L'opération de lecture ne garantit pas la lecture de toutes les données disponibles, ni aucune lecture de données si SocketChannel est en mode non bloquant. Dans le cas ci-dessus, vous pouvez avoir besoin de plus d'un appel pour lire toutes les données transmises.

Vous avez besoin d'une sorte de moyen pour le code de réception de savoir quand il a lu toutes les données. Cela signifie soit que l'expéditeur envoie des informations sur le contenu des données (longueur, etc.) dans le cadre d'un protocole convenu, ou en utilisant le canal pour un seul bloc de données et en lisant le canal jusqu'à ce qu'il soit fermé.

+0

Il convient également de mentionner que vous pouvez spécifier si le canal est en mode non bloquant .... –

+0

Oui, le canal est en mode non bloquant. Veuillez revoir mon exemple une fois de plus. – Deepak

+0

Cela dépend vraiment du type de socket. Une socket de flux (par exemple, TCP) n'a aucune limite de conservation, comme vous l'avez mentionné. Cependant, une socket de datagramme (f.e., UDP) concerne essentiellement les paquets transmis et reçus avec des limites explicites. –

0

Si vous envoyez des données aussi binaires que vous le suggérez, il n'y a aucune raison pour que \ n soit traité différemment d'un autre octet. Si c'était des choses comme des images se corrompraient tout le temps. L'encodage ne devrait pas faire de différence si vous utilisez des caractères < = 127.

Je suggérerais que votre application ne fonctionne pas comme vous le pensez et que vous lisez des chaînes qui supposent \ n une terminaison quelque part votre code. Pouvez-vous poster le code pour l'écriture et la lecture de la chaîne? c'est-à-dire comment déterminez-vous quand la chaîne se termine?

Questions connexes