Ik heb al enkele topics over mijn chat client-server systeem geopend, en hier is er weer eentje. 
Ik zit met het volgende, raar probleem:
Mijn client kan moeiteloos een connectie maken met mijn server. Die server stuurt dan een 'synchronisatie'-bericht terug naar alle geconnecteerde clients om de juiste userlijst te bekomen. Dit werkt perfect, ook bij het disconnecten.
Maar wanneer een client nu zijn nickname wil veranderen, doet hij dit door middel van een 'nickchange'-bericht waarin zijn nieuwe nick wordt meegegeven. De server analyseert dit, verandert de nick in zijn userpool en mulicast terug een 'synchronisatie'-bericht naar alle clients.
Het probleem zit nu juist bij die ene synchronisatie:
De server genereert het 'synchronisatie'-bericht perfect (dus met de juiste nickname); wanneer dat bericht bij de client toekomt, is de nickname die zou moeten veranderd zijn, terug zoals oorspronkelijk
.
Misschien eventjes volgend code-fragment om alles te verduidelijken
CLIENT: dit wordt uitgevoerd wanneer de client op OK klikt bij het dialoogvenster om zijn nickname te veranderen:
SERVER: De server zal dit bericht ontvangen en 'parsen':
Zoals je zit zal eerst de nickchange worden uitgevoerd, een nieuwe synchronise-bericht aangemaakt worden en terug geparsed en tenslotte verzonden naar alle clients. Die DEBUG-sectie toont de juiste, aangepaste, nicknames
CLIENT: Dit 'synchronisatie'-bericht komt toe bij de client:
Ik heb aangeduid waar het misloopt.
wat output tijdens nickchange:
server
client
Zijn er hier mensen die al eens hetzelfde probleem hebben voorgehad en die me zouden kunnen helpen of tips geven. Ik heb me hier al op rot-gezocht (sorry voor mijn taalgebruik
).
Ik zit met het volgende, raar probleem:
Mijn client kan moeiteloos een connectie maken met mijn server. Die server stuurt dan een 'synchronisatie'-bericht terug naar alle geconnecteerde clients om de juiste userlijst te bekomen. Dit werkt perfect, ook bij het disconnecten.
Maar wanneer een client nu zijn nickname wil veranderen, doet hij dit door middel van een 'nickchange'-bericht waarin zijn nieuwe nick wordt meegegeven. De server analyseert dit, verandert de nick in zijn userpool en mulicast terug een 'synchronisatie'-bericht naar alle clients.
Het probleem zit nu juist bij die ene synchronisatie:
De server genereert het 'synchronisatie'-bericht perfect (dus met de juiste nickname); wanneer dat bericht bij de client toekomt, is de nickname die zou moeten veranderd zijn, terug zoals oorspronkelijk
Misschien eventjes volgend code-fragment om alles te verduidelijken
CLIENT: dit wordt uitgevoerd wanneer de client op OK klikt bij het dialoogvenster om zijn nickname te veranderen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| void cmdOk_actionPerformed(ActionEvent e)
{
String[] newNick = new String[1];
newNick[0] = txtNickname.getText();
// een NICKCHANGE-actionmessage aanmaken
AbstractMessage nickMsg = new ActionMessage(ownerWindow.getThisUser(),
null,
shared.Action.NICKCHANGE,
newNick);
ownerWindow.getSender().send(nickMsg);
this.dispose();
} |
SERVER: De server zal dit bericht ontvangen en 'parsen':
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
| public void parseMessage(AbstractMessage m) throws IOException
{
if (m instanceof ActionMessage)
{
ActionMessage actionMsg = (ActionMessage)m;
switch (actionMsg.getAction())
{
// DISCONNECT: de betreffende user verwijderen en terug SYNCHRONIZEREN
case Action.DISCONNECT:
users.removeUser(actionMsg.getSource().getNickname());
synchMsg = new ActionMessage(null, null, Action.SYNCHRONISE, users.toArrayUsers());
parseMessage(synchMsg);
break;
// SYNCHRONIZE: een actionmessage broadcasten met alle connected users
case Action.SYNCHRONISE:
for (int i=0; i<users.getUserCount(); i++)
{
actionMsg.setDestination(users.getUser(i));
sender.send(actionMsg);
}
break;
// NICKCHANGE: de nickname van een user veranderen
case Action.NICKCHANGE:
User u = users.getUser(actionMsg.getSource().getNickname());
u.setNickname(actionMsg.getAttachment(0));
synchMsg = new ActionMessage(null, null, Action.SYNCHRONISE, users.toArrayUsers());
/*****DEBUG*************/
for (int i=0; i<users.getUserCount(); i++)
System.out.println(users.getUser(i));
/******END DEBUG********/
parseMessage(synchMsg);
break;
}
}
.....
} |
Zoals je zit zal eerst de nickchange worden uitgevoerd, een nieuwe synchronise-bericht aangemaakt worden en terug geparsed en tenslotte verzonden naar alle clients. Die DEBUG-sectie toont de juiste, aangepaste, nicknames
CLIENT: Dit 'synchronisatie'-bericht komt toe bij de client:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| msg = (AbstractMessage)objin.readObject();
if (msg != null)
{
// message doorsturen naar de parser
/************************
HIER LOOPT HET MIS !!*/
/***********************/
System.out.println("message received: " + msg);
/*******DEBUG -- PRINT DE ATTACHMENTS***********/
String[] att = ((ActionMessage)msg).getAttachment();
for (int i=0; i<att.length; i++)
System.out.println(att[i]);
/******END DEBUG*****************************/
parser.parseMessage(msg); |
Ik heb aangeduid waar het misloopt.
wat output tijdens nickchange:
server
Een nickchange-bericht is ontvangen met de juiste (aangepaste) nickname als 'attachment'Listening for messages ...
serverSocket.accept() timeout
Listening for connection ...
Message received: *** ACTION: Nickchange
Feyd-Rautha
serverSocket.accept() timeout
Listening for connection ...
client
Een 'synchronisatie'-bericht komt toe, maar met de verkeerde nicknamemessage received: *** ACTION: Synchronised
D5E0E262.kabel.telenet.be
Zijn er hier mensen die al eens hetzelfde probleem hebben voorgehad en die me zouden kunnen helpen of tips geven. Ik heb me hier al op rot-gezocht (sorry voor mijn taalgebruik
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.