Заголовок программирования сокета Java - PullRequest
0 голосов
/ 22 мая 2010

Я пытаюсь отправить файл через сокет Java и получить его через другой. Тем не менее, это происходит:

Отправить содержимое:

/ * Это просто файл для передачи * /

Поступило:

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

OutputStream os = sock.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(mybytearray);
oos.flush();
oos.close();

А для клиента:

BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
FileOutputStream fos = new FileOutputStream("newfile.java");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
bos.write(mybytearray, 0 , current);
bos.flush();
bos.close();
sock.close();

Ответы [ 3 ]

1 голос
/ 22 мая 2010

Зачем проходить ObjectOutputStream? Либо используйте OutputStream напрямую через метод write, либо выберите, например, DataOutputStream, если вы сочтете это необходимым.

Кроме того, вы не должны использовать классы Reader для передачи двоичных данных. Из API Reader:

Абстрактный класс для чтения символьных потоков .


Полный пример отправки файла через сокет можно найти здесь:

Передача файла через сокет .

Ключевой код на стороне сервера:

  OutputStream os = sock.getOutputStream();
  System.out.println("Sending...");
  os.write(mybytearray,0,mybytearray.length);
  os.flush();
  sock.close();

Ключевой код на стороне клиента:

bytesRead = is.read(mybytearray,0,mybytearray.length);
1 голос
/ 22 мая 2010

Было бы полезно увидеть код, но то, что у вас там, выглядит как основные случайные данные Некоторые вещи для проверки:

  1. К какому типу относится буфер приема?
  2. Сколько символов вы, похоже, отправляете и получаете?
  3. Вы уверены, что ваш оператор печати на приемном конце указывает на правильное место?
0 голосов
/ 22 мая 2010

Это не имеет никакого смысла. Если вы используете ObjectOutputStream, вы должны использовать ObjectInputStream, чтобы прочитать его. Если вы хотите использовать Reader для чтения, вы должны использовать Writer для его записи.

...