Hallo Allemaal,
Ik ben redelijk nieuw in het programmeren van C#.
Ik ben voor mijn afstudeeropdracht een windows service(noemen we even Server) aan het maken die communiceert via .NET remoting met een windows form(Noemen we even Client). Ik mag van het bedrijf geen gebruik maken van WCF, omdat ze daar nog geen ervaring mee hebben.
Nu moet deze communicatie twee kanten op gaan. Ik heb als basis http://www.codeproject.co...Remoting-Events-Explained voor de communicatie deze gebruikt en geimplementeerd in mijn applicatie.
Ik heb er twee problemen mee.
Probleem 1
Na +/- 5 minuten kan de client geen berichten meer versturen naar de server. De server stuurt wel nog berichten naar de client
Bij het verzenden van een bericht naar de server geeft hij de volgende foutmelding:
Probleem 2
Als ik de client disconnect en opnieuw wil connecten wordt er ook een foutmelding gegeven:
De code client side
Wie zou mij bij deze problemen kunnen helpen?
Ik ben redelijk nieuw in het programmeren van C#.
Ik ben voor mijn afstudeeropdracht een windows service(noemen we even Server) aan het maken die communiceert via .NET remoting met een windows form(Noemen we even Client). Ik mag van het bedrijf geen gebruik maken van WCF, omdat ze daar nog geen ervaring mee hebben.
Nu moet deze communicatie twee kanten op gaan. Ik heb als basis http://www.codeproject.co...Remoting-Events-Explained voor de communicatie deze gebruikt en geimplementeerd in mijn applicatie.
Ik heb er twee problemen mee.
Probleem 1
Na +/- 5 minuten kan de client geen berichten meer versturen naar de server. De server stuurt wel nog berichten naar de client
Bij het verzenden van een bericht naar de server geeft hij de volgende foutmelding:
code:
1
2
3
4
5
6
7
8
9
10
11
| System.Runtime.Remoting.RemotingException: De verbinding met object /serverExample.Rem is verbroken of het object bestaat niet op de server. Server stack trace: bij System.Runtime.Remoting.Channels.ChannelServices.CheckDisconnectedOrCreateWellKnownObject(IMessage msg) bij System.Runtime.Remoting.Channels.ChannelServices.DispatchMessage(IServerChannelSinkStack sinkStack, IMessage msg, IMessage& replyMsg) Exception rethrown at [0]: bij System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) bij System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) bij RemotingEvents.Common.IServerObject.PublishMessage(String Message) bij Communication.Communication.connect(String serverip) in C:\Documents and Settings\xxx\Mijn documenten\Visual Studio 2008\Projects\AlarmService\AlarmClient.Communication\Communication.cs:regel 85 |
Probleem 2
Als ik de client disconnect en opnieuw wil connecten wordt er ook een foutmelding gegeven:
code:
1
2
3
| System.Runtime.Remoting.RemotingException: Kanaal remotingClient is niet met externe services geregistreerd. bij System.Runtime.Remoting.Channels.ChannelServices.UnregisterChannel(IChannel chnl) bij Communication.Communication.disconnect() in C:\Documents and Settings\xxx\Mijn documenten\Visual Studio 2008\Projects\AlarmService\AlarmClient.Communication\Communication.cs:regel 111 |
De code client side
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
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
| #region Fields IServerObject remoteServer; EventProxy eventProxy; TcpChannel tcpChan; BinaryClientFormatterSinkProvider clientProv; BinaryServerFormatterSinkProvider serverProv; //string serverip; private string serverURI; private bool connected = false; Encryptie.Encryptie encryp = new Encryptie.Encryptie(); public event EventHandler<OnMessageConnection> RaiseOnMessageConnection; public event EventHandler<OnMessageNieuwAlarm> RaiseOnMessageNieuwAlarm; public event EventHandler<OnMessageChangedAlarm> RaiseOnMessageChangedAlarm; public event EventHandler<OnMessageUserQuery> RaiseOnMessageUserQuery; public event EventHandler<OnMessageAlarmQuery> RaiseOnMessageAlarmQuery; public event EventHandler<OnError> RaiseOnError; #endregion #region Initialisatie /// <summary> /// In deze method wordt de communicatie met de server geïnitialiseerd. /// </summary> /// <param name="serverip"></param> public void Init(string serverip) { clientProv = new BinaryClientFormatterSinkProvider(); serverProv = new BinaryServerFormatterSinkProvider(); serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; eventProxy = new EventProxy(); eventProxy.MessageArrived += new MessageArrivedEvent(eventProxy_MessageArrived); Hashtable props = new Hashtable(); props["name"] = "remotingClient"; props["port"] = 0; //First available port serverURI = "tcp://" + serverip + ":15000/serverExample.Rem"; //Replace with your IP tcpChan = new TcpChannel(props, clientProv, serverProv); ChannelServices.RegisterChannel(tcpChan); RemotingConfiguration.RegisterWellKnownClientType(new WellKnownClientTypeEntry(typeof(IServerObject), serverURI)); } #endregion #region Communicatiemethods /// <summary> /// Deze method kan aangeroepen worden vanuit de client. Deze moet worden aangeroepen bij de start van de applicatie. zonder dit is er geen communicatie mogelijk. /// </summary> public void connect(string serverip) { if (connected) return; try { remoteServer = (IServerObject)Activator.GetObject(typeof(IServerObject), serverURI); remoteServer.PublishMessage("Client Connected"); //This is where it will break if we didn't connect remoteServer.MessageArrived += new MessageArrivedEvent(eventProxy.LocallyHandleMessageArrived); //sendMessage("Client Connected"); connected = true; } catch (Exception ex) { connected = false; OnRaiseOnError(new OnError("Connecting failed!", ex.ToString())); } //sendMessage("Client Connected"); } /// <summary> /// Deze method moet aangeroepen worden bij het afsluiten of verbreken van de verbinding met de server. /// </summary> public void disconnect() { if (!connected) return; try { remoteServer.MessageArrived -= eventProxy.LocallyHandleMessageArrived; //Now we can close it out ChannelServices.UnregisterChannel(tcpChan); connected = false; } catch (Exception ex) { connected = false; OnRaiseOnError(new OnError("Disconnect failed!", ex.ToString())); } } /// <summary> /// Met deze method kan de client controleren of er verbinding is met de server. /// </summary> /// <returns></returns> public bool IsConnected() { if (connected == true) { return true; } else { return false; } } /// <summary> /// Deze method moet aangeroepen worden om een bericht te encrypten en daarna te verzenden. /// </summary> /// <param name="message"></param> private void sendMessage(string message) { if (!connected) return; try { string encryptedMessage = encryp.EncryptString(message); remoteServer.PublishMessage(encryptedMessage); } catch (RemotingException ex) { OnRaiseOnError(new OnError("Sendmessage failed!", ex.ToString())); } catch (Exception ex2) { OnRaiseOnError(new OnError("Sendmessage failed!", ex2.ToString())); } } |
Wie zou mij bij deze problemen kunnen helpen?
Xbox: Gulpener88