Hi!
Mein Problem:
Ich habe einen Server und einen Client.
Zwischen ihnen sollen verschiedene Daten versendet werden und zwar:
1. gleichzeitig
2. an verschiedene Threads
erster Lösungsansatz:
Für jeden Thread eine neue Verbindung aufbauen -> schwachsinn bei der Kommunikation übers Internet, denn was ist wenn sich zwei clients, die hinter dem selben Router hängen, gleichzeitig sich mit dem Server verbinden? - Totales Stromwirrwarrr
zweiter Lösungsansatz:
Alles durch eine Verbindung(Object(In/Out)putStream) mit Datenpacket-Objekten senden.
Die Datenpakete enthalten einen Namen, an dem der andere Feststellen kann wofür die Daten sind, und eine byte Array mit den Daten.
Das ganze wird dann mit einer Klasse "TrichterOutput" zusammen versendet:
Und auf der anderen Seite wieder getrennt:
Wie ihr sehen könnt ist das sozusagen ein Stream den man mit mehreren Streams gleichzeitig verketten kann.
Mein Problem besteht nun, dass der Thread auf der lesenden Seite an folgender Stelle nicht weiter läuft:
Ein Blick in den Stack sagt mir das der ObjectInputStream auf den Header des Streams wartet und der einfach nicht ankommt.
Was kann ich machen damit der Thread da weiterläuft?
Ich mein tin.getInputStream(type) liefert ja ein PipedInputStream da is doch schon ein Header drin oder?
THX for help
Mein Problem:
Ich habe einen Server und einen Client.
Zwischen ihnen sollen verschiedene Daten versendet werden und zwar:
1. gleichzeitig
2. an verschiedene Threads
erster Lösungsansatz:
Für jeden Thread eine neue Verbindung aufbauen -> schwachsinn bei der Kommunikation übers Internet, denn was ist wenn sich zwei clients, die hinter dem selben Router hängen, gleichzeitig sich mit dem Server verbinden? - Totales Stromwirrwarrr
zweiter Lösungsansatz:
Alles durch eine Verbindung(Object(In/Out)putStream) mit Datenpacket-Objekten senden.
Die Datenpakete enthalten einen Namen, an dem der andere Feststellen kann wofür die Daten sind, und eine byte Array mit den Daten.
Das ganze wird dann mit einer Klasse "TrichterOutput" zusammen versendet:
Code:
public class TrichterOutputStream extends OutputStream
{
final ObjectOutputStream oout;
public TrichterOutputStream(ObjectOutputStream out)
{
this.oout=out;
}
@Override
@Deprecated
/**
* Does nothing!
* Please use getOutputStream(String name) instead.
* */
public void write(int arg0) throws IOException
{
}
public OutputStream getOutputStream(final String name) throws IOException
{
//creating Pipes and connect them
PipedOutputStream out=new PipedOutputStream();
final PipedInputStream in=new PipedInputStream(out);
Thread lesen=new Thread(new Runnable()
{
public void run()
{
while(true)
{
try {
byte[] buffer=new byte[1024];
in.read(buffer);
oout.writeObject(new DataPacket(name, buffer));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
lesen.setName("TrichterOutputStream$lesen");
lesen.start();
return out;
}
}
Und auf der anderen Seite wieder getrennt:
Code:
public class TrichterInputStream extends InputStream
{
final ObjectInputStream in;
HashMap<String, PipedOutputStream> outputstreams=new HashMap<String, PipedOutputStream>();
HashMap<String, PipedInputStream> inputstreams=new HashMap<String, PipedInputStream>();
public TrichterInputStream(ObjectInputStream in1)
{
this.in=in1;
Thread lesen=new Thread(new Runnable()
{
public void run()
{
while(true)
{
try {
DataPacket datapacket = (DataPacket) in.readObject();
if(outputstreams.get(datapacket.getName()) != null)
{
outputstreams.get(datapacket.getName()).write(datapacket.getData());
}
else
{
//creating Pipes and connect them
PipedOutputStream out=new PipedOutputStream();
PipedInputStream in=new PipedInputStream(out);
//adding them to the list
outputstreams.put(datapacket.getName(), out);
inputstreams.put(datapacket.getName(), in);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
lesen.setName("TrichterInputStream$lesen");
lesen.start();
}
@Override
@Deprecated
/**
* Will always return -1.
* Please use getInputStream(String name).
* */
public int read() throws IOException
{
return -1;
}
public InputStream getInputStream(String name) throws IOException
{
if(outputstreams.get(name) == null)
{
//creating Pipes and connect them
PipedOutputStream out=new PipedOutputStream();
PipedInputStream in=new PipedInputStream(out);
//adding them to the list
outputstreams.put(name, out);
inputstreams.put(name, in);
}
return inputstreams.get(name);
}
}
Wie ihr sehen könnt ist das sozusagen ein Stream den man mit mehreren Streams gleichzeitig verketten kann.
Mein Problem besteht nun, dass der Thread auf der lesenden Seite an folgender Stelle nicht weiter läuft:
Code:
TrichterInputStream tin;
//....
//....
//....
ObjectInputStream oin=new ObjectInputStream(tin.getInputStream(type));
Was kann ich machen damit der Thread da weiterläuft?
Ich mein tin.getInputStream(type) liefert ja ein PipedInputStream da is doch schon ein Header drin oder?
THX for help