簡體   English   中英

將套接字的OutputStream與DataOutputStream進行比較

[英]Compare the OutputStream of a Socket with a DataOutputStream

我在Hashtable outputStreams;有一堆DataOutputStream Hashtable outputStreams; 每個都有一個Socket 我想遍歷它們,但是我想排除一個特定的Socket 我一直在嘗試以下算法,但似乎不起作用。

for(Enumeration e = outputStreams.elements(); e.hasMoreElements(); ) {

    DataOutputStream dout = (DataOutputStream)e.nextElement();
    OutputStream sdout = null;
    try {
        sdout = socket.getOutputStream();
    } catch (IOException ie) {
        ie.printStackTrace();
    }

    if (dout != sdout) {
        try {
            dout.writeUTF(message);
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}

大概這是行不通的,因為socket.getOutputStream()返回“原始”輸出流,並且在某個地方您將為每個原始輸出流創建一個DataOutputStream 這些將永遠是不一樣的。

我最好的猜測是要遍歷套接字,跳過不想寫的套接字, 然后找到相應的DataOutputStream並對其進行寫入。

似乎Hashtable會將實例的副本插入其支持結構。 Andypandy對您的問題是正確的,但是隨后我想知道OuputStream的表(您將不會包裝套接字輸出流的表)是否可以解決該問題,而不能解決。

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Hashtable;

public class Main
{

    public static void main(String[] args) throws IOException {

        Hashtable<Integer, OutputStream> ht = new Hashtable<Integer, OutputStream>();

        for(int i = 0; i < 5; i++)
            ht.put( i, new DataOutputStream(new ByteArrayOutputStream()) );

        Socket sock = new Socket("google.com", 80);
        ht.put( ht.size(), sock.getOutputStream() );

        for(OutputStream dos : ht.values())
            System.out.println(dos);

        System.out.println(sock.getOutputStream());
    }
}

輸出:

java.net.SocketOutputStream@112b853
java.io.DataOutputStream@36428
java.io.DataOutputStream@a4b78b
java.io.DataOutputStream@e3f6d
java.io.DataOutputStream@1660d22
java.io.DataOutputStream@e84763
java.net.SocketOutputStream@1a6c368

插入表中的套接字的輸出流的地址與原始輸出流的地址不同。 由於沒有equals覆蓋,因此沒有簡單的方法就可以在不了解其相應套接字的情況下有意義地比較流。 您應該完全重新考慮設計,也許使用套接字描述符作為鍵。

編輯

正如blackcompe所指出的,DataOutputStream和OutputStream都不會覆蓋Object.equals。 因此,這無濟於事。 無論如何,每次調用getOutpuStream()方法都可能會創建一個新的Object。

您可能必須創建新的對象來保存Outputstreams及其有關套接字的信息。 並遍歷它們。

套接字的輸出流從不等於DataOutputStream的任何實例。 您需要重新考慮您實際上在這里問的是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM