我是否可以更改我正在使用的流的类型而不关闭并重新打开Java中的套接字?

时间:2011-08-01 04:04:34

标签: java sockets

我正在使用Java进行一些套接字编程,我希望能够在同一个套接字中使用ObjectOutputStreamDataOutputStreamPrintWriter之间进行更改/连接。这是可能的,最好的方法是什么?

我尝试过只创建两种类型的对象,例如ObjectOutputStreamDataOutputStream,但这似乎不起作用。

我想在它们之间切换的原因是,例如,发送一个文本命令"INFO",表示我将发送一个带有信息的对象或一个命令"DATA"发出信号'我'我即将发送数据。任何有关最佳方法的建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

您只能使用一种基础流类型,但您可以从任何地方获取该数据。

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 :(得分:1)

为什么您希望*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);