使用套接字同时从客户端接收消息(使用Async)

时间:2016-03-05 13:47:49

标签: vb.net sockets networkstream

我有一个Cyber​​Cafe软件程序,其代码通过客户端(套接字)发送消息,并由服务器(也是套接字)使用网络流接收。 (我对套接字和网络流有点新鲜)

服务器端:

'receive msg from client
    Private Sub OnRecieve(ByVal ar As IAsyncResult)
        Try
            Dim ns As NetworkStream = CType(ar.AsyncState, NetworkStream)
            ns.BeginRead(byteData, 0, byteData.Length, New AsyncCallback(AddressOf OnRecieve), ns)
            Dim bytesRec As Byte() = byteData
            Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytesRec)
            Invoke(New _Read(AddressOf Read), message)
            ns.Flush()
            ns.Close()
        Catch ex As Exception
            'check for Disconnection or Force Disconnection
            Invoke(New _dc(AddressOf dc))
        End Try
    End Sub

客户端:

'send msg to server
    Private Sub Send(ByVal msg As String, ByVal client As Socket)
        Try
            Dim sendBytes As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(msg)
            NetStream = New NetworkStream(client)
            NetStream.BeginWrite(sendBytes, 0, sendBytes.Length, New AsyncCallback(AddressOf OnSend), NetStream)
        Catch ex As Exception
            If Not clientSocket.Connected Then   'if connection was forcibly disconnected
                'reconnecting to the server
                Invoke(New _status(AddressOf status), clientSocket)
                Connect()
            End If
        End Try
    End Sub

方案是,有2个客户端等待连接到服务器(另一个是虚拟机),当我最终运行服务器时,同时连接没有问题,但同时收到消息不起作用出。有时它只收到一条消息。有时消息是错误的。也许是僵局。

那么,我该如何实现这种情况呢?我问谷歌兄弟:P和他告诉我有关AsyncTask的事情,但我不知道怎么做:(

任何帮助都有义务^ _ ^对任何不良英语道歉。

2 个答案:

答案 0 :(得分:0)

<强>更新 抱歉我的问题不完整。 我已经添加了EndRead / EndWrite方法,但我不确定我是否正确使用了EndRead方法...我刚刚在BeginRead之前插入了EndRead,但它仍然有效。 谢谢你帮助Visual Vincent ^ _ ^。 此外,我的套接字在连接后作为标记存储在ListView中。并且它们的IPAddress和HostName存储在数据库(MSAccess)中。我没有在此代码中使用任何TCP。 Just Sockets和NetworkStreams。 IDK如果可以,但它确实有效。

服务器端(完整):

Imports System.Net, System.Net.Sockets
Imports System.Data.OleDb

Public Class Server

    Dim serverSocket As Socket
    Dim clientSocket As Socket
    Dim netstream As NetworkStream
    Dim byteData(1023) As Byte
    Dim ipEndPoint As IPEndPoint

    Dim myList As New List(Of String)
    Dim myList2 As New List(Of String)
    Dim txt As String

    'listening to clients from port 8800
    Private Sub frmServer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Invoke(New _AddExistingClient(AddressOf AddExistingClient))
        Listen()
    End Sub


    Delegate Sub _AddExistingClient()
    Private Sub AddExistingClient()
        Try
            If conn.State = ConnectionState.Open Then conn.Close()
            conn.Open()
            query = "select * from Clients_tbl"
            comm = New OleDbCommand(query, conn)
            reader = comm.ExecuteReader

            While reader.Read
                Dim lvi As New ListViewItem(reader("HostName").ToString)
                lvi.Text = reader("HostName")
                lvi.SubItems.Add("P00.00") 'price 1
                lvi.SubItems.Add("00:00:00") 'time 2
                lvi.ImageKey = "Grey.ico"
                lsvClients.Items.Add(lvi)
            End While

            lsvClients.Sort()
            conn.Close()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub Listen()
        Try
            serverSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            ipEndPoint = New IPEndPoint(IPAddress.Any, 8800)
            serverSocket.Bind(ipEndPoint)
            serverSocket.Listen(1)
            serverSocket.BeginAccept(New AsyncCallback(AddressOf OnAccept), Nothing)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub OnAccept(ByVal ar As IAsyncResult)
        Try
            clientSocket = serverSocket.EndAccept(ar)
            serverSocket.BeginAccept(New AsyncCallback(AddressOf OnAccept), Nothing)
            CheckIfExist(clientSocket)

            netstream = New NetworkStream(clientSocket)
            netstream.BeginRead(byteData, 0, byteData.Length, New AsyncCallback(AddressOf OnRecieve), netstream)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub


    Delegate Sub _CheckIfExist(ByVal client As Socket)
    Private Sub CheckIfExist(ByVal client As Socket)
        Try
            If InvokeRequired Then
                Invoke(New _CheckIfExist(AddressOf CheckIfExist), client)
                Exit Sub
            End If

            Dim RemoteIP As String = IPAddress.Parse(CType(client.RemoteEndPoint, IPEndPoint).Address.ToString).ToString
            Dim host As String = Dns.GetHostEntry(RemoteIP).HostName.ToString

            If conn.State = ConnectionState.Open Then conn.Close()
            conn.Open()
            query = "select * from Clients_tbl where HostName = '" + host + "'"
            comm = New OleDbCommand(query, conn)
            reader = comm.ExecuteReader

            While reader.Read
                If reader("IPAddress").ToString <> RemoteIP Then 'if socket do exist in the database but IPAddress was changed
                    ChangeIP(RemoteIP, host)
                End If
                count += 1
            End While

            If count = 0 Then 'if socket do not exist in the database
                Add2DB(RemoteIP, host)
                AddNewClient(client)
            ElseIf count = 1 Then 'if socket do exist in the database and in the listview
                For Each item As ListViewItem In lsvClients.Items
                    If item.Text = host Then
                        item.Tag = client
                        item.ImageKey = "Red.ico"
                    End If
                Next
            ElseIf count > 1 Then
                MsgBox("Duplicate found")
            End If

            count = 0
            conn.Close()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub


    Delegate Sub _ChangeIP(ByVal RemoteIP As String, ByVal host As String)
    Private Sub ChangeIP(ByVal RemoteIP As String, ByVal host As String) 'connection is still opened
        Try
            If InvokeRequired Then
                Invoke(New _ChangeIP(AddressOf ChangeIP), RemoteIP, host)
                Exit Sub
            End If

            query = "update Clients_tbl set IPAddress = '" + RemoteIP + "' where HostName = '" + host + "'"
            comm = New OleDbCommand(query, conn)
            reader = comm.ExecuteReader
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub


    Delegate Sub _Add2DB(ByVal RemoteIP As String, ByVal host As String)
    Private Sub Add2DB(ByVal RemoteIP As String, ByVal host As String) 'connection is still opened
        Try
            If InvokeRequired Then
                Invoke(New _Add2DB(AddressOf Add2DB), RemoteIP, host)
                Exit Sub
            End If

            query = "insert into Clients_tbl values('" + RemoteIP + "', '" + host + "')"
            comm = New OleDbCommand(query, conn)
            reader = comm.ExecuteReader
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub


    'add client to ListView
    Delegate Sub _AddNewClient(ByVal client As Socket)
    Private Sub AddNewClient(ByVal client As Socket)
        Try
            If InvokeRequired Then
                Invoke(New _AddNewClient(AddressOf AddNewClient), client)
                Exit Sub
            End If

            Dim lvi As New ListViewItem(client.LocalEndPoint.ToString)
            Dim RemoteIP As String = IPAddress.Parse(CType(client.RemoteEndPoint, IPEndPoint).Address.ToString).ToString
            Dim host As String = Dns.GetHostEntry(RemoteIP).HostName.ToString

            lvi.Text = host
            lvi.Tag = client
            lvi.SubItems.Add("P00.00") 'price 1
            lvi.SubItems.Add("00:00:00") 'time 2
            lvi.ImageKey = "Red.ico"
            lsvClients.Items.Add(lvi)
            lsvClients.Sort()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub


    'Send msg to specific client
    Private Sub Send(ByVal msg As String, ByVal client As Socket)
        Try
            netstream = New NetworkStream(client)
            Dim sendBytes As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(msg)
            netstream.BeginWrite(sendBytes, 0, sendBytes.Length, New AsyncCallback(AddressOf OnSend), netstream)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
    Private Sub OnSend(ByVal ar As IAsyncResult)
        Try
            Dim ns As NetworkStream = CType(ar.AsyncState, NetworkStream)
            ns.EndWrite(ar)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub


    Delegate Sub _dc()
    Private Sub dc()
        For Each lvi As ListViewItem In lsvClients.Items
            If Not lvi.Tag Is Nothing Then
                Dim S As Socket = lvi.Tag
                If Not S.Connected Then lvi.ImageKey = "Grey.ico"
            End If
        Next
    End Sub

    'receive msg from client
    Private Sub OnRecieve(ByVal ar As IAsyncResult)
        Try
            Dim ns As NetworkStream = CType(ar.AsyncState, NetworkStream)
            ns.EndRead(ar)
            ns.BeginRead(byteData, 0, byteData.Length, New AsyncCallback(AddressOf OnRecieve), ns)
            Dim bytesRec As Byte() = byteData
            Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytesRec)
            Invoke(New _Read(AddressOf Read), message)
            ns.Flush()
            ns.Close()
        Catch ex As Exception
            'check for Disconnection or Force Disconnection
            Invoke(New _dc(AddressOf dc))
        End Try
    End Sub


    Delegate Sub _Read(ByVal msg As String)
    Private Sub Read(ByVal msg As String)
        Try
            myList2 = msg.Split("~").ToList
            'mylist.Add("0") 'command number
            'mylist.Add(host) 'host name of this client
            'mylist.Add(lblState.Text)
            'mylist.Add(lblTime.Tag.ToString)

            Select Case Integer.Parse(myList2(0))
                Case 0
                    For Each lvi As ListViewItem In lsvClients.Items
                        If lvi.Text = myList2(1) Then
                            If myList2(2) = "Timed" Then
                                lvi.ImageKey = "Green.ico"
                            ElseIf myList2(2) = "Open"
                                lvi.ImageKey = "Blue.ico"
                            End If
                            lvi.SubItems(2).Tag = Integer.Parse(myList2(3))
                        End If
                    Next
            End Select
            myList2.Clear()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
        Invoke(New _Counter(AddressOf Counter))
    End Sub

    Delegate Sub _Counter()
    Private Sub Counter()
        Try
            If lsvClients.Items.Count > 0 Then
                For Each time As ListViewItem In lsvClients.Items
                    '//////////////
                    If time.ImageKey = "Green.ico" Then
                        time.SubItems(2).Tag -= 1
                        time.SubItems(2).Text = GetTime(time.SubItems(2).Tag)
                        If time.SubItems(2).Tag = 0 Then time.ImageKey = "Red.ico"
                    ElseIf time.ImageKey = "Blue.ico" Then
                        time.SubItems(2).Tag += 1
                        time.SubItems(2).Text = GetTime(time.SubItems(2).Tag)
                    End If
                    '//////////////
                Next
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Function GetTime(ByVal time As Integer) As String
        Dim Hrs As Integer  'number of hours   '
        Dim Min As Integer  'number of Minutes '
        Dim Sec As Integer  'number of Sec     '

        'Seconds'
        Sec = time Mod 60

        'Minutes'
        Min = ((time - Sec) / 60) Mod 60

        'Hours'
        Hrs = ((time - (Sec + (Min * 60))) / 3600) Mod 60

        Return Format(Hrs, "00") & ":" & Format(Min, "00") & ":" & Format(Sec, "00")
    End Function

    Private Sub btnStartTime_Click(sender As Object, e As EventArgs) Handles btnStartTime.Click
        Try
            If lsvClients.SelectedItems.Count <> 0 Then
                myList.Add("0")
                myList.Add("10") 'time
                myList.Add("15") 'price
                txt = String.Join("~", myList)
                Send(txt, lsvClients.SelectedItems(0).Tag)
                lsvClients.SelectedItems(0).SubItems(2).Tag = myList(1)
                lsvClients.SelectedItems(0).ImageKey = "Green.ico"
                myList.Clear()
            Else
                MsgBox("Select first")
            End If
        Catch ex As Exception
            Dim client As Socket = lsvClients.SelectedItems(0).Tag
            If Not client.Connected Then
                MsgBox("Disconnected")
            End If
        End Try
    End Sub

    Private Sub btnOpenTime_Click(sender As Object, e As EventArgs) Handles btnOpenTime.Click
        Try
            If lsvClients.SelectedItems.Count <> 0 Then
                myList.Add("2")
                myList.Add("0") 'time
                myList.Add("0") 'price
                txt = String.Join("~", myList)
                Send(txt, lsvClients.SelectedItems(0).Tag)
                lsvClients.SelectedItems(0).SubItems(2).Tag = myList(1)
                lsvClients.SelectedItems(0).ImageKey = "Blue.ico"
                myList.Clear()
            Else
                MsgBox("Select first")
            End If
        Catch ex As Exception
            Dim client As Socket = lsvClients.SelectedItems(0).Tag
            If Not client.Connected Then
                MsgBox("Disconnected")
            End If
        End Try
    End Sub

    Private Sub btnExtendTime_Click(sender As Object, e As EventArgs) Handles btnExtendTime.Click
        Try
            If lsvClients.SelectedItems.Count <> 0 Then
                myList.Add("1")
                myList.Add("10") 'time
                myList.Add("15") 'price
                txt = String.Join("~", myList)
                Send(txt, lsvClients.SelectedItems(0).Tag)
                lsvClients.SelectedItems(0).SubItems(2).Tag += myList(1)
                lsvClients.SelectedItems(0).ImageKey = "Green.ico"
                myList.Clear()
            Else
                MsgBox("Select first")
            End If
        Catch ex As Exception
            Dim client As Socket = lsvClients.SelectedItems(0).Tag
            If Not client.Connected Then
                MsgBox("Disconnected")
            End If
        End Try
    End Sub

    Private Sub btnPauseTime_Click(sender As Object, e As EventArgs) Handles btnPauseTime.Click
        Try
            If lsvClients.SelectedItems.Count <> 0 Then
                myList.Add("3")
                myList.Add("00:00:00") 'time
                myList.Add("0") 'price
                txt = String.Join("~", myList)
                Send(txt, lsvClients.SelectedItems(0).Tag)
                If lsvClients.SelectedItems(0).ImageKey = "Green.ico" Then
                    lsvClients.SelectedItems(0).ImageKey = "Green2Yellow.ico"
                ElseIf lsvClients.SelectedItems(0).ImageKey = "Blue.ico"
                    lsvClients.SelectedItems(0).ImageKey = "Blue2Yellow.ico"
                End If
                myList.Clear()
            Else
                MsgBox("Select first")
            End If
        Catch ex As Exception
            Dim client As Socket = lsvClients.SelectedItems(0).Tag
            If Not client.Connected Then
                MsgBox("Disconnected")
            End If
        End Try
    End Sub

    Private Sub btnResumeTime_Click(sender As Object, e As EventArgs) Handles btnResumeTime.Click
        Try
            If lsvClients.SelectedItems.Count <> 0 Then
                myList.Add("4")
                myList.Add("00:00:00") 'time
                myList.Add("0") 'price
                txt = String.Join("~", myList)
                Send(txt, lsvClients.SelectedItems(0).Tag)
                If lsvClients.SelectedItems(0).ImageKey = "Green2Yellow.ico" Then
                    lsvClients.SelectedItems(0).ImageKey = "Green.ico"
                ElseIf lsvClients.SelectedItems(0).ImageKey = "Blue2Yellow.ico"
                    lsvClients.SelectedItems(0).ImageKey = "Blue.ico"
                End If
                myList.Clear()
            Else
                MsgBox("Select first")
            End If
        Catch ex As Exception
            Dim client As Socket = lsvClients.SelectedItems(0).Tag
            If Not client.Connected Then
                MsgBox("Disconnected")
            End If
        End Try
    End Sub
End Class

客户端(完整):

Imports System.Net, System.Net.Sockets, System.IO

Public Class Client

    Dim clientSocket As Socket
    Dim NetStream As NetworkStream
    Dim byteData(1023) As Byte
    Dim ipEndpoint As IPEndPoint
    Dim host As String = Dns.GetHostName
    Dim ip As IPAddress = IPAddress.Parse("192.168.56.1")  'Dns.GetHostEntry(host).AddressList(0)
    Dim AppPath As String = Application.StartupPath

    Dim writer As StreamWriter
    Dim reader As StreamReader

    Dim mylist As New List(Of String)
    Dim txt As String

    '/////////////////////connecting to server at port 8800
    Private Sub Client_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        Try
            Invoke(New _readtext(AddressOf readtext))
            Connect()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub Connect()
        Try
            clientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            ipEndpoint = New IPEndPoint(ip, 8800)
            clientSocket.BeginConnect(ipEndpoint, New AsyncCallback(AddressOf OnConnect), Nothing)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub OnConnect(ByVal ar As IAsyncResult)
        Try
            Invoke(New _status(AddressOf status), clientSocket)
            clientSocket.EndConnect(ar)
            'Invoke(New _SendTimeState(AddressOf SendTimeState))
            NetStream = New NetworkStream(clientSocket)
            NetStream.BeginRead(byteData, 0, byteData.Length, New AsyncCallback(AddressOf Recieve), NetStream)
            'Invoke(New _SendTimeState(AddressOf SendTimeState))
        Catch ex As Exception
            If Not clientSocket.Connected Then
                Invoke(New _status(AddressOf status), clientSocket)
                Connect()
            End If
        End Try
    End Sub


    Delegate Sub _SendTimeState()
    Private Sub SendTimeState()
        Try
            mylist.Add("0") 'command number
            mylist.Add(host) 'host name of this client
            mylist.Add(lblState.Text)
            mylist.Add(lblTime.Tag.ToString)

            txt = String.Join("~", mylist)
            Send(txt, clientSocket)
            txt = ""
            mylist.Clear()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub


    Delegate Sub _readtext()
    Private Sub readtext()
        Try
            reader = New StreamReader(AppPath & "\time.txt")
            Dim x As Integer = reader.ReadLine
            reader.Close()
            If x <> 0 Then
                lblTime.Tag = x
                reader = New StreamReader(AppPath & "\state.txt")
                Dim state As String = reader.ReadLine
                reader.Close()
                lblState.Text = state
                Timer1.Start()
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub


    Delegate Sub _writetext(ByVal file As String, ByVal txt As String)
    Private Sub writetext(ByVal file As String, ByVal txt As String)
        Try
            If InvokeRequired Then
                Invoke(New _writetext(AddressOf writetext), file, txt)
                Exit Sub
            End If

            writer = New StreamWriter(AppPath & file, False)
            writer.WriteLine(txt)
            writer.Close()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Delegate Sub _status(ByVal client As Socket)
    Private Sub status(ByVal client As Socket)
        lblConnection.Text = client.Connected.ToString
    End Sub

    'receive msg from server
    Private Sub Recieve(ByVal ar As IAsyncResult)
        Try
            Dim ns As NetworkStream = CType(ar.AsyncState, NetworkStream)
            ns.EndRead(ar)
            ns.BeginRead(byteData, 0, byteData.Length, New AsyncCallback(AddressOf Recieve), ns)
            Dim bytesRec As Byte() = byteData
            Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytesRec)
            Invoke(New _Read(AddressOf Read), message)
        Catch ex As Exception
            If Not clientSocket.Connected Then   'if connection was forcibly disconnected
                'reconnecting to the server
                Invoke(New _status(AddressOf status), clientSocket)
                Connect()
            End If
        End Try
    End Sub


    Delegate Sub _Read(ByVal msg As String)
    Private Sub Read(ByVal msg As String)
        Try
            mylist = msg.Split("~").ToList
            'mylist(0) is command
            'mylist(1) is time
            'mylist(2) price


            Select Case Integer.Parse(mylist(0))
                Case 0 'timed
                    lblState.Text = "Timed"
                    lblTime.Tag = Integer.Parse(mylist(1))
                    lblTime.Text = GetTime(lblTime.Tag)
                    lblPrice.Text = Integer.Parse(lblPrice.Text) + Integer.Parse(mylist(2))
                    lblState.Tag = lblState.Text
                    writetext("\time.txt", lblTime.Tag.ToString)
                    writetext("\state.txt", "Timed")
                    Timer1.Start()
                Case 1 'extend time
                    lblTime.Tag += Integer.Parse(mylist(1))
                    lblTime.Text = GetTime(lblTime.Tag)
                    lblPrice.Text = Integer.Parse(lblPrice.Text) + Integer.Parse(mylist(2))
                    If Not Timer1.Enabled Then Timer1.Start()
                Case 2 'open time
                    lblState.Text = "Open"
                    lblTime.Tag = Integer.Parse(mylist(1))
                    lblTime.Text = GetTime(lblTime.Tag)
                    lblPrice.Text = mylist(2)
                    lblState.Tag = lblState.Text
                    writetext("\time.txt", lblTime.Tag.ToString)
                    writetext("\state.txt", "Open")
                    Timer1.Start()
                Case 3 'pause time
                    lblState.Text = "Paused"
                    Timer1.Stop()
                Case 4 'resume time
                    lblState.Text = lblState.Tag
                    Timer1.Start()
                Case 5 'stop time
                    lblState.Text = "Stop"
                    writetext("\time.txt", "0")
                    writetext("\state.txt", "Stop")
                    Timer1.Stop()
                Case 6 'shutdown

                Case 7 'reset

                Case 8 'send msg

            End Select

            mylist.Clear()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    'send msg to server
    Private Sub Send(ByVal msg As String, ByVal client As Socket)
        Try
            Dim sendBytes As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(msg)
            NetStream = New NetworkStream(client)
            NetStream.BeginWrite(sendBytes, 0, sendBytes.Length, New AsyncCallback(AddressOf OnSend), NetStream)
        Catch ex As Exception
            If Not clientSocket.Connected Then   'if connection was forcibly disconnected
                'reconnecting to the server
                Invoke(New _status(AddressOf status), clientSocket)
                Connect()
            End If
        End Try
    End Sub

    Private Sub OnSend(ByVal ar As IAsyncResult)
        Try
            Dim ns As NetworkStream = CType(ar.AsyncState, NetworkStream)
            ns.EndWrite(ar)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
        Try
            Select Case lblState.Text
                Case "Timed"
                    lblTime.Tag -= 1
                    lblTime.Text = GetTime(lblTime.Tag)
                    writetext("\time.txt", lblTime.Tag.ToString)
                    If lblTime.Tag = 0 Then Timer1.Stop()
                Case "Open"
                    lblTime.Tag += 1
                    lblTime.Text = GetTime(lblTime.Tag)
                    writetext("\time.txt", lblTime.Tag.ToString)
            End Select
        Catch ex As Exception
            If Not clientSocket.Connected Then   'if connection was forcibly disconnected
                'reconnecting to the server
                Invoke(New _status(AddressOf status), clientSocket)
                Connect()
            End If
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Function GetTime(ByVal time As Integer) As String
        Dim Hrs As Integer  'number of hours   '
        Dim Min As Integer  'number of Minutes '
        Dim Sec As Integer  'number of Sec     '

        'Seconds'
        Sec = time Mod 60

        'Minutes'
        Min = ((time - Sec) / 60) Mod 60

        'Hours'
        Hrs = ((time - (Sec + (Min * 60))) / 3600) Mod 60

        Return Format(Hrs, "00") & ":" & Format(Min, "00") & ":" & Format(Sec, "00")
    End Function
End Class

OleDb模块: Imports System.Data.OleDb

Module oledb

Dim AppPath As String = Application.StartupPath
Public conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppPath + "\ServerDatabase.mdb;User Id=Admin;Password=")
Public comm As OleDbCommand
Public reader As OleDbDataReader
Public query As String
Public count As Integer

End Module

(无法在我的第一篇文章中添加此帖子,因为它达到了它的最大容量:P)

答案 1 :(得分:0)

这里略微改变了收到的功能:

'receive msg from client
    Private Sub Recieve(ByVal ar As IAsyncResult)
        Try
            Dim ns As NetworkStream = CType(ar.AsyncState, NetworkStream)
            Dim message As String = ""
            ByteSize = ns.EndRead(ar)
            message = String.Concat(message, System.Text.ASCIIEncoding.ASCII.GetString(byteData, 0, ByteSize))
            ns.BeginRead(byteData, 0, byteData.Length, New AsyncCallback(AddressOf Recieve), ns)

            'if there are still data left in the network stream
            While ns.DataAvailable
                ns.BeginRead(byteData, 0, byteData.Length, New AsyncCallback(AddressOf Recieve), ns)
            End While

            Invoke(New _Read(AddressOf Read), message)
        Catch ex As Exception
            'check for Disconnection or Force Disconnection
            Invoke(New _dc(AddressOf dc))
        End Try
    End Sub

我在有关NetworkStream.EndRead的MS文档中看到,EndRead首先出现在BeginRead之前。也许它只适用于Read。 NetworkStream.EndRead Method (IAsyncResult)

但问题仍然存在:(

相关问题