Zdravím všichni, už nějakou chvilku si pohrávám s programováním ve VB .Net (hraju si momentálně s Visual Basic 2008 Express), ale rozhodně nejsem žádný guru. Spis bych se označil jako "bastlič-drátotah", jak kdysi vcelku trefně poznamenal jeden můj kolega. Inu nastala jednoho dne potřeba zbavit se tohoto cejchu a pozvednout moje programátorství na úroveň alespoň začátečník. Řekl jsem si, že aplikace typu klient-datábaze (řekl bych první krůčky v životě začínajícího programátora, jako jeden ze základů jeho působení) můzu nesměle označit, jako povětšinou zvládnuté a s chutí se vrhnout do světa větších a působivějších úkolů. Co může být pro programátora mého "formátu" větší výzvou, než spojit dohromady dva pocitace po síti a donutit je poslat si mezi sebou data. Co takhle soubor? Ne, to je pro začátek moc najednou. Co takhle nějaký string? ... aspoň písmenko? Našel jsem si na netu pár příkladů jak na to a nadšeně se vrhnul do víru tcpClientu a tcpListeneru. Světe div se, komunikace se asi na stotisící pokus povedla. Moje nadseni neznalo konce. Památná věta "MÁMO, ONO TO NA MĚ PÍPLO!" dostala nových rozměrů. Ono to totiž píplo když já jsem chtěl a ne, kdyz nějaká tajemná AI (řekl bych spíš nějaký zašitý sadistický šotek) si zrovna vzpomněla, ze je potřeba uživatele dostatečně zprudit neznámou hláškou s tajemným obsahem. Mno, abych se nepřechválil, šotek si stejne ke mně našel cestu a zchladil moje nadšení hluboko pod bod mrazu. Ja vím, moc kecám a málo píšu k věci, tak se vrhnu primo k jádru pudla. Mám server aplikaci, která poslouchá na portu 7761 a čeká na příchozi spojeni. Vypada to nějak takhle:
Sub startListening()
Dim tcpL As New TcpListener(7761)
Dim tcpC As New TcpClient
Dim netStream As NetworkStream
Dim msg As String
tcpL.Start()
Do Until False
tcpC = tcpL.AcceptTcpClient()
netStream = tcpC.GetStream
Dim recStream(10024) As Byte
Dim buffLen As Integer = CInt(tcpC.ReceiveBufferSize)
Try
netStream.Read(recStream, 0, buffLen)
Catch ex As SocketException
If ex.NativeErrorCode = 10054 Then
MsgBox("Client down")
End If
End Try
msg = Encoding.ASCII.GetString(recStream)
If msg <> "" And Not msg Is Nothing Then
MsgBox(msg)
End If
Loop
End Sub
pustím k práci klienta, který pošle malou zprávu:
Sub sendMsg(ByVal msg As String)
Dim tcpC As New TcpClient
tcpC.Connect(System.Net.IPAddress.Parse("192.168.1.1"), 7761)
netStream = tcpC.GetStream
Dim sendData As Byte() = Encoding.ASCII.GetBytes(msg)
netStream.Write(sendData, 0, sendData.Length)
netStream.Flush()
tcpC.Close()
End Sub
vše proběhne jak má, zpráva se odešle, server přijme a zobrazí. Svět je krásný. Ale problém nastane, když klienta vypnu. Server se začne cítit osaměle a uzemní mě hláškou: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. Ošetření chyby je jedna věc. Try - Catch - End Try udělá své. Ale v tomto případě ne. Vůbec nedojde na zachycení chyby a serverová aplikace rovnou padá. Mohli by jste mi prosím poradit s tím, jak správně ukončit klienta, nebo jak správně zachytit chybu na serveru, abych dokázal říct: Tak klient už své řekl, víc nechce, tak je off? Díky za jakoukoliv pomoc
|