Сравните OutputStream Сокета с DataOutputStream - PullRequest
1 голос
/ 11 октября 2011

У меня есть куча 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();
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 11 октября 2011

Предположительно, это не работает, потому что socket.getOutputStream() возвращает «необработанный» выходной поток, и где-то вы создали DataOutputStream для каждого из этих необработанных выходных потоков.Они никогда не будут прежними.

Моя лучшая догадка о том, чего вы пытаетесь достичь, - это перебирать сокеты, пропуская тот, в который вы не хотите писать, и затем найти соответствующий DataOutputStream и записать в него.

1 голос
/ 11 октября 2011

Похоже, что Hashtable вставит копию экземпляра в свою структуру поддержки. Andypandy прав насчет вашей проблемы, но потом мне стало интересно, исправит ли таблица OuputStream s (где вы не обернули бы поток вывода сокета), но это не так.

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, нет простого способа осмысленного сравнения потоков без знания их соответствующих сокетов. Вам следует полностью переосмыслить свой дизайн, возможно, используя дескриптор сокета в качестве ключа.

0 голосов
/ 11 октября 2011

Выходной поток сокета никогда не равен ни одному экземпляру DataOutputStream. Вы должны переосмыслить то, что вы на самом деле спрашиваете здесь.

0 голосов
/ 11 октября 2011

EDIT

Как указало blackcompe, ни DataOutputStream, ни OutputStream не переопределяют Object.equals. Так что это не помогает. В любом случае метод getOutpuStream () может создавать новый объект каждый раз, когда его вызывают.

Вам, вероятно, придется создавать новые Объекты, которые содержат потоки Outputstream и информацию об их сокете. И перебирать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...