@Chame1eon
Пишу скрипты, глотаю кофе!

Не могу понять причину потери байтов в процессе передачи данных между клиентом и сервером, кто может помочь?

Участок кода сервера
try {
			// Подключени необходимых методов
			InputStream is = socket.getInputStream();
			DataInputStream dis = new DataInputStream(is);
			byte[] message = new byte[dis.readInt()];

			// Получение массива данных
			dis.read(message);
			System.out.println("Message received");
			System.out.println(message.length+"\n"+message);
			mes = message;

		} catch (IOException e) {
			System.out.println("Error 6");
		}


Участок кода клиента
Socket socket = new Socket(ip, port1);
		OutputStream out = socket.getOutputStream();
		Scanner scn = new Scanner(System.in);

		// Рукопожатие
		InputStream is = socket.getInputStream();
		DataInputStream dis = new DataInputStream(is);
		byte[] message = new byte[dis.readInt()];
		dis.read(message);

		if (new String(message).equals("handshake request")) {
			String hand = "handshake response";
			byte[] handshake = hand.getBytes("UTF-8");
			out.write(handshake.length);
			out.write(handshake);
			out.flush();
			
			System.out.println(handshake.length+"\n"+handshake);
		}else{ 
			System.out.println("Error");
		}


Помогите разобраться! Ввел вывод лог информацию по размеру массива и его содержанию, вот что получил:

Клиент
18
[B@610455d6

Сервера
308830574
[B@658afb6a

В итоге получается так, что в дороге терятеся 3 первых символа

Заранее спасибо!
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
@umpteenthdev
Если предполагается работа только со строками, то попробуйте использовать методы readUTF для чтения потока и writeUTF для передачи данных в поток, передавая им строки напрямую. В сочетании с DataOutputStream и DataInputStream.

spoiler

Чтение:
DataInputStream in = new DataInputStream(socket.getInputStream());
            String msg = in.readUTF();


Запись:
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
           out.writeUTF(msg);
           out.flush();

Ответ написан
Пригласить эксперта
Ответы на вопрос 2
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Метод read не обязан отдавать столько, сколько просишь. Он возвращает количество реально прочитанных байт (один и больше) или -1, если данные кончились. Читайте в буфер в цикле. Раз там строка - в StringBuilder.
Ответ написан
Комментировать
@Chame1eon Автор вопроса
Пишу скрипты, глотаю кофе!
То есть, вы предлагаете читать размер массива как и сам массив или я чего-то не догоняю?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы