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

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

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

,器端的实现:

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

内容概要:本文介绍了一个关于三相桥式全控整流及有源逆变电路的实验仿真模型,重点研究三相整流器与逆变器在Simulink环境下的建模与仿真技术。内容涵盖电力电子变换器的工作原理、控制策略设计、系统动态响应分析,并进一步扩展至10kV配电网中不同中性点接地方式(中性点不接地、经小电阻接地、经消弧线圈接地)下的单相、两相短路接地及相间短路故障的仿真研究,全面呈现了电力系统典型故障的暂态特性。此外,文档还整合了丰富的科研资源,涵盖电力系统优化、新能源并网、故障诊断、微电网调度等多个前沿方向,充分体现了Matlab/Simulink在电气工程仿真中的核心地位和广泛应用价值。; 适合人群:电气工程、自动化、电力电子等相关专业的高校学生、科研人员及工程技术人员,具备一定的电路理论基础和仿真软件操作经验者更佳。; 使用场景及目标:①用于教学实验中帮助理解三相整流与逆变电路的工作机制;②支撑科研项目中对电力系统故障特性的建模与分析;③作为开发新型控制算法(如PWM控制、低电压穿越等)的仿真验证平台;④辅助完成毕业设计、课题研究或工程方案评估; 阅读建议:此资源以Simulink仿真实现为核心,强调理论与实践结合,建议读者在学习过程中同步搭建模型,动手调试参数,深入理解各模块功能与系统整体行为,同时可参考文中提供的完整资源链接拓展研究视野。
内容概要:本文介绍了一个关于风光制氢合成氨系统优化研究的论文复现资源,依托Cplex求解器在Matlab环境中实现系统建模与求解。该资源聚焦于新能源耦合系统,涵盖风能、太阳能发电制氢,并进一步合成氨的全流程能量管理与优化调度,通过数学建模与优化算法实现系统经济性与运行效率的最大化。内容不仅包括风光出力不确定性处理、电解水制氢、氢气储存与转化、氨合成工艺等关键环节的建模,还整合了多种智能优化算法与电力系统调度策略,如二阶锥规划、多目标优化与需求响应机制,旨在为科研人员提供一套完整的综合能源系统优化研究框架与代码实现范例。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础的研究生、科研人员及工程技术人员,尤其适合从事新能源系统优化、综合能源系统规划、氢能与氨能转化等前沿方向的研究者。; 使用场景及目标:① 复现高水平期刊论文中的风光制氢合成氨系统优化模型,掌握Cplex在Matlab中的建模与求解流程;② 学习并应用二阶锥规划、多目标优化、需求响应等先进优化方法于综合能源系统科研项目中;③ 借助提供的完整Matlab代码案例,快速搭建仿真环境,加速科研进程,提升学术创新能力与工程实践水平。; 阅读建议:此资源以科研复现为核心,强调理论与实践深度融合,建议读者在学习过程中结合文档中的代码实例,逐步调试与理解模型构建逻辑,并尝试进行参数调整与模型拓展,以深化对综合能源系统多能耦合与优化调度机制的理解与应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值