【问题标题】:Java Sockets: read/write stream in two different ways one by oneJava Sockets:以两种不同的方式一一读/写流
【发布时间】:2015-01-02 04:10:55
【问题描述】:

关于 java.net.Socket 和 java.io。 服务端要向客户端发送消息,先用 ObjectOutputStream 写(读,用于客户端)一个对象,然后用 BufferedWriter 写(读,用于客户端)。

如果我只使用ObjectXXXStream 或只使用BufferedXXX,我可以成功,但不能在一个流中同时使用它们。我该怎么办?

服务器:

oos = new ObjectOutputStream(client.getOutputStream());
oos.writeObject(dc);
// oos.close();

bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));          

bw.write("hahaha");
bw.flush();

while(true){
    line=br.readLine();
    if(line != null){
        ExecuteInput(line);
    }
}   

在客户端:

ois = new ObjectInputStream(socket.getInputStream());
XXX dc = (XXX) ois.readObject();
// ois.close();

String line;
while(true){
    try {
        // System.out.println("000000");
        line=br.readLine();
        // System.out.println("111111");
        if(line != null)
            System.out.println("aaaa "+line);
    } catch (IOException e) {
        System.out.println("222222");
        e.printStackTrace();
    }
}

【问题讨论】:

  • 为什么不为两者选择相同的?

标签: java sockets stream


【解决方案1】:

您可以将ObjectOutputStream 用于两个写入操作。一个套接字不能有 2 种不同类型的流,因此您应该选择最实用的。

不过,我会质疑是否真的需要发送对象。您可以改为发送对象的状态和一个“操作码”,指定应该如何处理该状态。但是我不知道dc的目的,所以无法确认

【讨论】:

  • 我只是觉得解析一组数据很冗长(我只想将dc中的数据传输到客户端)。看来我应该改用 BufferedReader/Writer。
  • @nblintao 我觉得节省的带宽是值得的。如果您不发送对象,那么是的,BufferedReader。如果您要发送对象,您会寻找ObjectInputStream,因为BufferedReader 没有该功能
【解决方案2】:

当其中一个或多个被缓冲并且BufferedWriterObjectOutputStream 都被缓冲时,您不能在一个套接字上使用多个流/读取器/写入器。

只需使用ObjectOutputStream() 并将所有内容作为对象发送,或者通过writeUTF() 发送字符串,这意味着您必须使用readUTF(). 读取字符串

【讨论】:

    猜你喜欢
    • 2014-05-03
    • 2019-12-10
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多