2010-05-22 5 views
0

Я пытаюсь отправить файл через java-сокет и получить его через другой. Тем не менее, это происходит:Заголовок программирования сокета 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(); 
+0

Это дамп процесса отправителя или процесса приемника? –

+0

Должен видеть код ... –

ответ

1

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

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

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


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

Transfer a file via Socket.

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

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

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

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

1. Получить буфер - это байт [] 2. Я хочу отправить 39 байт и получить 66 3. Я думаю, что получение указывает на нужное место. Файл создан, у него слишком много 66 байт вместо 39. Я не уверен, что это то, что вы имеете в виду. – Andy

+0

Yup. Обратите внимание, что у вас почти столько же байт, сколько и ожидалось; это должно заставить вас задуматься о соответствующих типах.Теперь рассмотрим, что фактически делает ObjectOutputStream: он * кодирует * объект, чтобы его можно было восстановить. Когда вы отправляете свои данные как ObjectOutputStream, Java будет кодировать его как массив. См. Http://java.sun.com/j2se/1.4.2/docs/api/java/io/ObjectOutputStream.html Что вы получаете, это «сериализованная» форма массива байтов. –

+0

haha ​​thanks, я был настолько сосредоточен на клиентском коде, который я не видел, я отправлял поток вывода объекта. – Andy

0

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

Смежные вопросы