2009-05-18 4 views
3

Ich verwende die SocketChannel Java-Klasse für eine Client/Server-Anwendung. Ich kann Daten senden und abrufen. Aber wenn meine Daten '\n' enthalten, dann lese ich nicht die richtigen Daten. Zum Beispielwie senden und dann lesen n mit SocketChannel in 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); 

Ich benutze US-ASCII-Decodierung. Wie kann ich diese Art von Problem lösen?

Danke, Deepak

Antwort

0

Ich glaube, Sie mit dem ByteBuffer über die Verteilung ein Problem haben.

Ich hatte früher Probleme mit SocketChannel, wo Daten einfach zu halten schienen. Ich würde dabei einige sysouts auf ByteBuffer

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

Dies kann ein Schritt in der richtigen Richtung empfehlen, das Problem zu isolieren.

1

Die Leseoperation garantiert nicht, alle verfügbaren Daten zu lesen oder überhaupt irgendwelche Daten zu lesen, wenn sich der SocketChannel im nicht blockierenden Modus befindet. Im obigen Fall benötigen Sie möglicherweise mehr als einen Anruf, um alle übertragenen Daten zu lesen.

Sie benötigen eine Art für den Empfangscode, um zu wissen, wann er alle Daten gelesen hat. Das bedeutet, dass der Absender entweder Informationen über den Inhalt der Daten (Länge usw.) als Teil eines vereinbarten Protokolls senden muss oder indem er den Kanal für nur einen Datenblock verwendet und den Kanal liest, bis er geschlossen wird.

+0

Sollten Sie auch erwähnen, können Sie angeben, ob sich der Kanal im nicht blockierenden Modus befindet. –

+0

Ja, Kanal befindet sich im nicht blockierenden Modus. Bitte gehen Sie noch einmal durch mein Beispiel. – Deepak

+0

Es hängt wirklich davon ab, welche Art von Socket es ist. Ein Stream-Socket (z. B. TCP) hat keine Grenzerhaltungen, wie Sie bereits angedeutet haben. Ein Datagramm-Socket (z. B. UDP) ist jedoch sehr stark über Pakete, die mit expliziten Grenzen gesendet und empfangen werden. –

0

Wenn Sie Daten als binär senden, wie Sie vorschlagen, gibt es keinen Grund, dass \ n anders als jedes andere Byte behandelt würde. Wenn es Dinge wie Bilder gäbe, würden sie die ganze Zeit beschädigt werden. Die Codierung sollte keinen Unterschied machen, wenn Sie Zeichen verwenden < = 127.

Ich würde vorschlagen, Ihre Anwendung funktioniert nicht so, wie Sie denken, dass es ist und dass Sie Strings lesen, die eine \ n Beendigung irgendwo in annehmen dein Code.

Können Sie den Code zum Schreiben und Lesen der Zeichenfolge posten. Wie bestimmen Sie, wann die Zeichenfolge endet?

Verwandte Themen