Toon posts:

[Java]StreamCorruptedException

Pagina: 1
Acties:
  • 39 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik ben een IM aan het schrijven, bij de client heb ik een klasse ConnectionHandler die instaat voor de communicatie tussen client - server, deze klasse implementeerd runnable dus in de run methode zal altijd gekeken worden of er nieuwe booschappen zijn voor de gebruiker (van andere users). Er zijn ook een aantal methoden die gebruikt worden voor deze klasse vb om de gebruikerslijst op te vragen (deze staat serverside). Nu zit ik met een irritant probleem ivm de streams, aangezien beide dezelfde stream gebruiken.

eerst en vooral de code van de klasse

Java:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
package Model;

import java.awt.SystemColor;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Vector;

import javax.swing.JOptionPane;

import quicktime.app.ui.ReleaseButton;

import Constant.Constanten;
import Controllers.ConnectionController;

public class ConnectionHandler implements Runnable
{
    private Socket connection;
    private ObjectInputStream input;
    private ObjectOutputStream output;
    private ConnectionController controller;
    private boolean streamingebruik;
    
    public ConnectionHandler(ConnectionController controller) 
    {
        this.controller = controller;
        try
        {
            connection = new Socket("192.168.111.5",2626);
            output = new ObjectOutputStream(connection.getOutputStream());
            input = new ObjectInputStream(connection.getInputStream());
            output.flush();
        }
        
        catch(ConnectException e)
        {
            JOptionPane.showMessageDialog(null,"Kan niet connecteren met server, kijk uw instellingen na!"
                    ,"Fout bij connecteren",JOptionPane.ERROR_MESSAGE);
        }
        catch(Exception e){e.printStackTrace();}
        
        
    }

    public void run()
    {
        String message = new String();      
        while(true)
        {
                
        try
        {   
            if(streamingebruik==false)
            {
                setIngebruik(true);
                /*if(input.available()!=0)
                {
                    message = (String)input.readObject();
                }*/
                //System.out.println("MESSAGE -->" + message);
            
            if(message.equals(Constanten.INCOMING_MESSAGE))
            {
                //System.out.println("INCOMING MESSAGE");
                String emailAfzender = (String)input.readObject();
                message = (String)input.readObject();
                System.out.println("De tekst = " + message);
                controller.setMessageToWindow(emailAfzender,message);
                
            }
                setIngebruik(false);
            }
            }
            
        catch(Exception e){e.printStackTrace();}
        }
}
    
    public void addUserToContactList(String emailOmToeTeVoegen)
    {
        try
        {
            output.writeObject(Constanten.ADD_USER_TO_CONTACTLIST);
            output.writeObject(controller.getEmailAdres());
            output.writeObject(emailOmToeTeVoegen);
        }
        catch(Exception e)
        {
            
        }
    }
    
    public Vector getContactPersonen()
    {
        //System.out.println("vraag contactpersonen");
        
        

        //System.out.println("vraag contactpersonen2");
        //try{input.wait(50);}catch(Exception e){e.printStackTrace();}
        //System.out.println("vraag contactpersonen3");
        
        while(streamingebruik==true)
        {
            
        }
        if(streamingebruik==false)
        {
            setIngebruik(true);
        
        try
        {
            output.writeObject(Constanten.REQUEST_USERS);
        }
        catch(Exception e){e.printStackTrace();}
        
                
            String message = new String();
        
            try
            {
                message = (String)input.readObject();
                //System.out.println("GetContactpersonen -> "+ message);
                
                //System.out.println(message + "   " + Constanten.REPLY_REQUEST_USER  );
                if(message.equals(Constanten.REPLY_REQUEST_USER))
                {
                    output.writeObject(controller.getEmailAdres());
                    output.flush();
                    
                    //System.out.println("input Vector");
                    Vector users = (Vector)input.readObject();
                
                    //System.out.println("--------------------------");
                    for(int x=0; x< users.size(); x++)
                    {
                        //System.out.println(users.elementAt(x));
                    }
                    //System.out.println("--------------------------");
                    setIngebruik(false);
                    return users;
                
                
            }}
            catch(Exception e){e.printStackTrace();}
            
            //System.out.println("Returning empty vector");
            setIngebruik(false);
            return new Vector();
            
            
        }
        else
        {
            System.out.println("Nieuwe vector in else");
            return new Vector();
        }
        }
    
    public void setStatusToOnline()
    {
        try
        {
            output.writeObject(Constanten.UPDATE_STATUS_ONLINE);
            output.writeObject(controller.getEmailAdres());
        }
        catch(Exception e)
        {
            
        }
    }
    
    public void setStatusToOffline()
    {
        try
        {
            output.writeObject(Constanten.UPDATE_STATUS_OFFLINE);
            output.writeObject(controller.getEmailAdres());
            
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
        
    }
    
    public void identificationToServer()
    {
        try
        {
            output.writeObject(Constanten.IDENTIFICATION);
            output.writeObject(controller.getEmailAdres());
        }
        catch(Exception e){}
        
    }
    
    public void sendMessageToUser(String toUserEmailAdress,String message)
    {
        try
        {
            output.writeObject(Constanten.INCOMING_MESSAGE);
            output.writeObject(toUserEmailAdress);
            output.writeObject(controller.getEmailAdres());
            output.writeObject(message);
            
            controller.setMessageToWindow(toUserEmailAdress,message);
        }
        catch(Exception e){}        
    }
    
    private synchronized void setIngebruik(boolean ingebruik)
    {
        streamingebruik = ingebruik;
    }
    
}


Met deze oplossing krijg ik geen fouten maar zal ik ook geen boodschappen ontvangen aangezien ik in de run methode de volgende code als commentaar heb gezet

Java:
1
2
3
4
if(input.available()!=0)
                {
                    message = (String)input.readObject();
                }


dus eigenlijk gaat hij niet kijken naar de boodschappen van andere gebruikers.

Maar wanneer ik de commentaar wegdoe (om toch boodschappen te ontvangen van andere gebruikers) geeft hij soms een fout bij het opstarten van de client


Java:
1
2
3
4
5
6
java.io.StreamCorruptedException
    at java.io.ObjectInputStream.readString(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at Model.ConnectionHandler.run(ConnectionHandler.java:60)
    at java.lang.Thread.run(Unknown Source)


de fout is op de volgende regel
Java:
1
message = (String)input.readObject();


meestal is de fout telkens een andere regel,maar telkens bij het inlezen ergens.

Misschien handig om te weten is dat, alles wordt opgeroepen bij het openen van het main venster. Onderaan ziet u waar alles wordt opgeroepen

Java:
1
2
3
4
5
6
7
8
9
10
11
12
public void openMainView(String emailadres)
    {
        container = new ChatVensterContainer();
        loginscreen = null;
        this.emailAdres = emailadres;
        window = new MainWindow(this);
        handler = new ConnectionHandler(this);
        new Thread(handler).start();
        handler.identificationToServer();
        setStatusToOnline();
        window.updateUsers(handler.getContactPersonen());
    }



Iemand een idee ?

Alvast bedankt,
Presnus

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

We hebben echt niet al je code nodig om je te helpen hoor. ;) Er is hier niemand die 220+ regels code voor je gaat debuggen.

Daarnaast staat er bovenaan onze topiclisting een sticky: Waar hoort mijn topic?. Als je die doorgelezen had, dan had je geweten dat dit topic in Programming hoort. ;)

Nu zou ik je topic kunnen verplaatsen, maar ik zie dat je een clone bent van een (tijdelijk) gebande user. Ik stel voor dat je die account conform de Banrichtlijnen laat unbannen en daarna een nieuw topic opent in Programming met daarin alleen relevante code. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Dit topic is gesloten.