在VB.NET2005中SOCKET通信的简单实现

本文介绍了一个基于TCP协议的文件传输系统实现方案,包括服务器端与客户端的设计与编程细节,并提供了时间同步功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  主要实现文件的传输和时间的简单校正

,器端的实现:

Imports System.Net.Sockets
Imports System.Net
Imports System.Text
Imports System.Threading
Imports System.IO
 
Public Class TCPListener
    Private myThread As Thread
    Private myListener As Socket
    Private bIsRun As Boolean = False
    Private mySocket As Socket
    Private Const HOZON_FLODER As String = "C:/Temp/"
    Private Const IPADD As String = "192.168.1.21"
    PrivateConstPORT As Integer = 1111
    Public Sub Listen()
        Dim localEndPoint As New IPEndPoint(Net.IPAddress.Parse(IPADD), PORT)
        Dim bytStream(1024) As Byte
        Dim intByteCnt As Integer = 0
        Dim strData As String = ""
        Dim tokens() As String
        bIsRun = True
        myListener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        myListener.Bind(localEndPoint)
        myListener.Listen(10)
        While True
            mySocket = myListener.Accept()
            While True
                intByteCnt = mySocket.Receive(bytStream)
                If intByteCnt <> 0 Then
                    strData = Encoding.GetEncoding("shift-jis").GetString(bytStream, 0, intByteCnt)
                    If strData = "exit" Then
                        mySocket.Shutdown(SocketShutdown.Both)
                        mySocket.Close()
                        BeginInvoke(New EventHandler(AddressOf AddEventLogs), _
                                "E|" & Now.ToString("yyyy/MM/dd HH:mm:ss    ") & "Exited!")
                        Exit While
时间的校正
                    ElseIf strData = "GetSystemTime" Then
                        'Thread.Sleep(2000)
                        mySocket.Send(Encoding.Default.GetBytes(Now.ToString("yyyy/MM/dd HH:mm:ss")))
                        Exit While
                    Else
                        tokens = strData.Split("@")
                        'ファイルを開く
                        Dim flStream As New FileStream(HOZON_FLODER & tokens(0), FileMode.OpenOrCreate, FileAccess.Write)
                        ''ファイルを書く
                        flStream.Write(Encoding.GetEncoding("shift-jis").GetBytes(tokens(1)), 0, tokens(1).Length)
 
                        flStream.Close()
                        mySocket.Send(Encoding.Default.GetBytes("OK"))
                        BeginInvoke(New EventHandler(AddressOf AddEventLogs), "F|" & intByteCnt.ToString & "|" _
                                    & Now.ToString("yyyy/MM/dd HH:mm:ss    ") & tokens(0) & "   received successfully!")
                    End If
                End If
            End While
        End While
        bIsRun = False
    End Sub
    Private Sub btnStartListen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartListen.Click
        'TCPリスナを開始する
        btnStartListen.Enabled = False
        btnStopListen.Enabled = True
        myThread = New Thread(AddressOf Listen)
        myThread.Start()
        lstLog.Items.Add(Now.ToString("yyyy/MM/dd HH:mm:ss    ") & "Start listening!")
    End Sub
    Private Sub GetFileServer_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ' TCPリスナを停止する
        If bIsRun Then
            myThread.Abort()
            If Not myListener Is Nothing Then
                myListener.Close()
                myListener = Nothing
            End If
        End If
    End Sub
    Private Sub btnStopListen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStopListen.Click
        ' TCPリスナを停止する
        myThread.Abort()
        myListener.Close()
        myListener = Nothing
        btnStartListen.Enabled = True
        btnStopListen.Enabled = False
        lstLog.Items.Add(Now.ToString("yyyy/MM/dd HH:mm:ss    ") & "Stop listening!")
    End Sub
    Private Sub AddEventLogs(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim tokens() As String
        tokens = sender.ToString.Split("|")
        If tokens(0) = "E" Then
            btnStartListen.Text = "開始"
        End If
        If tokens(0) = "F" Then
            Me.lblFileCnt.Text = CInt(lblFileCnt.Text) + 1
            Me.lblTotalFileByte.Text = CInt(lblTotalFileByte.Text) + CInt(tokens(1))
            lstLog.Items.Add(tokens(2))
        Else
            lstLog.Items.Add(tokens(1))
        End If
    End Sub
End Class
二,客户端的实现:

Imports System.Net

Imports System.Net.Sockets

Imports System.Text

Imports System.IO

Imports System.Threading

 

Public Class SendFile

    Private flStream As FileStream

    Private Const TOTAL_LENGTH As Integer = 94

    Private remoteEP As IPEndPoint

    Private cliSocket As Socket

    Private bIsRun As Boolean = False

    Private remoteIP As String = ""

    Private remotePort As String = ""

    Private bytStream(TOTAL_LENGTH - 1) As Byte

    Private sendData As String

    Private receivedData(1024) As Byte

    Private intBytCnt As Integer = 0

    Private Const strTestFileNM As String = "test.txt"

 

       Public Function SendAllFile(ByVal strFileName() As String) As Boolean

        Dim intIdx As Integer = 0

 

        Try

            SendAllFile = False

            If GetIPAndPort(remoteIP, remotePort) = False Then

                'ERROR

                Exit Function

            End If

            remoteEP = New IPEndPoint(Net.IPAddress.Parse(remoteIP), CInt(remotePort))

            cliSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

            cliSocket.Connect(remoteEP)

 

            bIsRun = True

            '文件名排序

            Array.Sort(strFileName)

 

            '送信

            For intIdx = 0 To strFileName.Length - 1

                Try

                    flStream = New FileStream(strFileName(intIdx), FileMode.Open, FileAccess.Read)

                    flStream.Read(bytStream, 0, TOTAL_LENGTH)

                    flStream.Close()

                Catch ex As Exception

                    Continue For

                End Try

                '送信

                sendData = strFileName(intIdx).Replace(SDCARD_TEMP_FOLDER, "") & "@" & _

                           Encoding.GetEncoding(FILE_ENCODING).GetString(bytStream, 0, bytStream.Length)

                cliSocket.Send(Encoding.GetEncoding(FILE_ENCODING).GetBytes(sendData))

                '等待服务器端的确认

                While True

                    intBytCnt = cliSocket.Receive(receivedData)

                    If Encoding.Default.GetString(receivedData, 0, intBytCnt) = "OK" Then

                        Exit While

                    End If

                    Array.Clear(receivedData, 0, receivedData.Length)

                End While

'文件拷贝

                File.Copy(strFileName(intIdx), FOLDER & strFileName(intIdx).Replace(SDCARD_TEMP_FOLDER, ""))

                File.Delete(strFileName(intIdx))

                flStream = New FileStream(FOLDER & strTestFileNM, FileMode.Append, FileAccess.Write)

                flStream.Write(bytStream, 0, TOTAL_LENGTH)

                flStream.Close()

                flStream = Nothing

            Next

            '送信完了

            cliSocket.Send(Encoding.Default.GetBytes("exit"))

            cliSocket.Shutdown(SocketShutdown.Both)

            cliSocket.Close()

            cliSocket = Nothing

            bIsRun = False

            SendAllFile = True

        Catch ex As Exception

            If bIsRun Then

                cliSocket.Send(Encoding.Default.GetBytes("exit"))

                cliSocket.Shutdown(SocketShutdown.Both)

                cliSocket.Close()

                cliSocket = Nothing

                bIsRun = False

            End If

            'ERROR

        End Try

    End Function

#End Region

 

    Private Function GetIPAndPort(ByRef ip As String, ByRef port As String) As Boolean

        GetIPAndPort = False

        Dim myCAKintcpEnv As New CAKintcpEnv

        Dim myCKintcpEnv As New CKintcpEnv

        Dim strIPAddress as string = 192.168.1.0

 

        ip = CInt(Mid(strIPAddress, 1, 3)).ToString & "." & _

                 CInt(Mid(strIPAddress, 4, 3)).ToString & "." & _

                 CInt(Mid(strIPAddress, 7, 3)).ToString & "." & _

                 CInt(Mid(strIPAddress, 11, 3)).ToString

            port = myCKintcpEnv.portNo            '端口号

            GetIPAndPort = True

        End If

    End Function

#End Region

 

'服务器端时间的取得

    Public Function GetServerDateTime() As Date

        Try

            'IP地址取得

            If GetIPAndPort(remoteIP, remotePort) = False Then

                'ERROR

                Exit Function

            End If

            remoteEP = New IPEndPoint(Net.IPAddress.Parse(remoteIP), CInt(remotePort))

            cliSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

            cliSocket.Connect(remoteEP)

            cliSocket.Send(Encoding.GetEncoding(FILE_ENCODING).GetBytes("GetSystemTime"))

            intBytCnt = cliSocket.Receive(receivedData)

            GetServerDateTime = System.DateTime.Parse(Encoding.GetEncoding("shift-jis").GetString(receivedData, 0, intBytCnt))

            cliSocket.Shutdown(SocketShutdown.Both)

            cliSocket.Close()

            cliSocket = Nothing

        Catch ex As Exception

            ERROR

        End Try

    End Function

#End Region

End Class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值