как отправить, а затем читать \ n с помощью SocketChannel в Java - PullRequest
3 голосов
/ 18 мая 2009

Я использую SocketChannel класс Java для клиент-серверного приложения. Я могу отправлять и получать данные. Но если мои данные содержат '\n', то я не читаю правильные данные. Например

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);

Я использую декодирование US-ASCII. Как я могу преодолеть этот тип проблемы?

Спасибо, Дипак

Ответы [ 3 ]

1 голос
/ 18 мая 2009

Операция чтения не гарантирует чтение всех доступных данных и вообще никаких данных, если SocketChannel находится в неблокирующем режиме. В приведенном выше случае вам может потребоваться более одного вызова для чтения всех переданных данных.

Вам нужен какой-то способ, чтобы получающий код узнал, когда он прочитал все данные. Это означает, что отправитель должен отправить информацию о содержимом данных (длина и т. Д.) Как часть согласованного протокола, либо использовать канал только для одного фрагмента данных и читать канал до его закрытия.

0 голосов
/ 18 мая 2009

Если вы отправляете данные в двоичном виде, как вы предлагаете, нет причины, по которой \ n будет обрабатываться иначе, чем любой другой байт. Если бы это были такие вещи, как изображения, все время бывали повреждены. Кодировка не должна иметь никакого значения, если вы используете символы <= 127. </p>

Я бы предположил, что ваше приложение работает не так, как вы думаете, и что вы читаете строки, которые предполагают завершение \ n где-то в вашем коде.

Можете ли вы опубликовать код для написания и чтения строки. то есть как вы определяете, когда заканчивается строка?

0 голосов
/ 18 мая 2009

Я думаю, что у вас есть проблема с ByteBuffer в распределении.

Ранее у меня были проблемы с SocketChannel, когда казалось, что данные просто задерживаются. Я бы порекомендовал сделать некоторые sysouts на ByteBuffer

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

Это может быть шагом в правильном направлении к изоляции проблемы.

...