Toon posts:

[java]Teruggeven van openstaand socket werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Momenteel zit ik met een probleem met Java sockets. Ik heb namelijk een functie waar in een socket aangemaakt wordt. Na de aanmaak van de socket wordt er een dataoutputstream gecreeerd. Hierna wordt de data getransferd naar een bepaalde client.

Dit gaat nog allemaal goed. Deze functie geef de client socket compoment terug. het probleem is vervolgens dat als er een dataoutputstream gecreeerd wordt op basis van de terug gegeven socket er geen data ontvangen wordt bij de andere client. het lijkt erop dat de socket afgesloten wordt terwijl dit niet het geval is. De client socket "is ongelijk aan null".

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Klinkt een beetje vreemd :)

Het zou moeten werken namelijk, misschien dat een stukje code uitkomst biedt, opdat wat java goeroe's het in een oog opslag kunnen zien ;)

Verwijderd

Topicstarter
De functie die de connectie met een andere client maakt en vervolgens die openstaande connectie terug geeft is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    // Handshake tussen clients.
    // Kijk of de client waarmee verbinding gemaakt wil worden ook het K2K protocol draait.
    public Socket Handshake( String IP, int port )
    {
        // Declare Objects
        DataOutputStream outputStream = null;
        Socket handshakeSocket = null;
        double startTime;
        
        //Creeer socket en outputstream
        try
        {
            handshakeSocket = new Socket(IP, port);
            outputStream = new DataOutputStream( handshakeSocket.getOutputStream() );
        }
        catch (Exception e)
        {
            System.out.println( "Error: Creating socket or building the Outputstream: \n" + e);
        }

        if ( handshakeSocket != null && outputStream != null)
        {
            // Socket en outputstream succesvol gecreeerd
            
            // Add een new handshake (in de multitread-list (Vectorlijst, handshakeVector) )
            addHandshake();
            // Stuur handshake
            try
            {
                System.out.println("Client stuurt requestHandshaking...");
                // Stuur de requestHandshake plus het handshakeID
                outputStream.writeBytes(Constants.requestHandshaking + ";" + (handshakeID -1) + ";" + "\n");
                outputStream.close();

                // Wacht totdat de handshake succesvol heeft plaats gevonden of er een time-out optreedt
                startTime = System.currentTimeMillis();

                while ( getHandshakeStatus( getVectorHandshakeID( handshakeID -1 ) ) == false && System.currentTimeMillis() <= startTime + Constants.timeOut )
                {
                    //System.out.println( "Waiting for handshake..." );
                }
                // Haal de handshake uit de multithead-list (Vectorlijst, handshakeVector)
                removeHandshake(getVectorHandshakeID( handshakeID -1 ));
            }
            catch (Exception e)
            {
                System.out.println("Error: While handshaking: \n" + e);
            }
        }
        return handshakeSocket;
    }

Vervolgens willen wij dus gebruiken van die openstaande socket verbinding, zodat wij geen tijd verliezen met het weer opnieuw aan maken van de socket verbinding.

Dus het resultaat van de functie (openstaande socket verbinding) willen wij weer gebruiken om data naar te versturen (resultHandShakeSocket is dus de return waarde van de functie Handshake:
code:
1
2
3
        outputStream = new DataOutputStream(resultHandShakeSocket.getOutputStream());
        outputStream.writeBytes("te versturen data......\n");
        outputStream.close();

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

't zou trouwens wel eens niet goed kunnen gaan met het dubbel openen van die outputstream ?

Verwijderd

Topicstarter
Dus jij bedoelt dat ik niet de socket terug moet geven maar de DataOutputStream?

Maar als je dan een DataInputstream wil gebruiken om data van die andere client te kunnen ontvangen dan is dat niet mogelijk, omdat je niet de socket component hebt?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 06 juni 2002 18:41 schreef kchong999 het volgende:
Dus jij bedoelt dat ik niet de socket terug moet geven maar de DataOutputStream?

Maar als je dan een DataInputstream wil gebruiken om data van die andere client te kunnen ontvangen dan is dat niet mogelijk, omdat je niet de socket component hebt?
Nee, dat weet ik niet :)

probeer binnen de functie zelf nog eens opnieuw een datainput/outputstream te openen?

Verwijderd

Topicstarter
Op welke manier bedoel je dit eigenlijk? Want het heeft niet echt zin om in de functie zelf die functie aan te roepen omdat de outputstream al wordt toegepast :)

Want ik eigenlijk wil is vanuit een andere functie die outputstreat te herbruiken.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 04-09 23:45
Probeer es een flush() ofzo :?

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Quote uit Sun's api doc's:
close
public void close()
throws IOException
Closes this output stream and releases any system resources associated with the stream.
The close method of FilterOutputStream calls its flush method, and then calls the close method of its underlying output stream.

Overrides:
close in class OutputStream
Throws:
IOException - if an I/O error occurs.
See Also:
flush(), out
Need I say more?? Door die close die je in je code hebt staan om je DataOutputStream te closen, close je automatisch je onderliggende outputstream, die van je socket en dus sluit je ook je socket.

Moeilijk he, even in de API ref kijken. Dit is weer een typisch voorbeeldje van RTFM.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Oplossing? Verwijder die regel met dat close statement helemaal. Die DataOuputStream uit scope laten gaan.

Op zich is het prima om meerdere keren iets aan te maken met de outputstream van de socket. Waar je wel op moet letten dan is als meerdere threads toegang hebben tot dezelfde socket of Output object gebaseerd op dezelfde socket. De reden daarvoor lijkt me vrij duidelijk.

Verwijderd

Hoi,

Ik ben ook lid van het team wat aan dit probleem werkt.
Ik heb naar de oplossing van DDD gekeken, het zag er leuk uit, maar helaas.
Het blijkt dat de outputstream niet de keyissue is.
Als je de Socket doorgeeft aan welke methode dan ook, dan word ie niet goed overgenomen.

Werking van het systeem:
Client A: Stuur code 1
client B: Krijgt code 1 binnen, stuurt de socket door naar een methode reply, die vervolgens code 2 zou moeten terugsturen. Op dit moment treed er al een probleem op: Code 2 word namlijk nooit ontvangen door client A.

Als we een nieuwe socket aanmaken (in de reply methode) dan werkt het wel. Het lastige is, dat de sokcet niet Null is.

Enig idee wat dan de oplossing is.
Pagina: 1