Могу ли я изменить тип используемого потока, не закрывая и не открывая сокет в Java? - PullRequest
3 голосов
/ 01 августа 2011

Я занимаюсь программированием сокетов на Java, и мне хотелось бы иметь возможность переключаться между использованием ObjectOutputStream, DataOutputStream и PrintWriter в одном сокете / соединении.Возможно ли это и каков наилучший способ сделать это?

Я пытался просто создать оба типа объектов, например ObjectOutputStream и DataOutputStream, но, похоже, это не работает.

Причина, по которой я хочу переключаться между ними, заключается, например, в том, чтобы отправить текстовую команду "INFO", которая сигнализирует о том, что я собираюсь отправить объект с информацией, или команду "DATA", сигнализирующую о том, что я собираюсьотправить данные.Любые советы о том, как сделать это, приветствуются.

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Вы можете использовать только один базовый тип потока, но вы можете получить эти данные из любого места.

DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));


public static void writeObject(DataOutputStream dos, Serializable obj) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(obj);
    oos.close();
    dos.writeUTF("OBJECT");
    byte[] bytes = baos.toByteArray();
    dos.writeInt(bytes.length);
    dos.write(bytes);
    dos.flush();
}

public static void writeBytes(DataOutputStream dos, byte[] bytes) {
    dos.writeUTF("BYTES");
    dos.writeInt(bytes.length);
    dos.write(bytes);
    dos.flush();
}

public static void writeText(DataOutputStream dos, String text) {
    dos.writeUTF("TEXT");
    dos.writeUTF(text);
    dos.flush();
}
1 голос
/ 01 августа 2011

Почему вы хотите *Stream преобразовать в *Writer.

Вы можете делать то, что хотите, с *Stream.

Socket s = new Socket();
DataOutputStream stream = new DataOutputStream( s.getOutputStream() );

byte[] bytes = "INFO".getBytes();
stream.write(bytes);
//....
bytes = "DATA".getBytes();
stream.write(bytes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...