版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
为了测试代码,需要分别创建两个应用程序文件。
窗体如下:
两个项目的代码在最前面添加:
Imports System.IO.MemoryMappedFiles
一、写入窗体的代码:
Dim sharedMemory As MemoryMappedFile
Dim viewAccessor As MemoryMappedViewAccessor
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'内存映射文件的名称
Dim sharedMemoryName As String = "TestSharedMemory"
'内存映射文件的大小
Dim sharedMemorySize As Integer = 1024
'使用CreateOrOpen创建或打开文件
sharedMemory = MemoryMappedFile.CreateOrOpen(sharedMemoryName, sharedMemorySize)
'创建映射到内存映射文件视图的访问器
viewAccessor = sharedMemory.CreateViewAccessor
End Sub
Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
'释放
sharedMemory.Dispose()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'字符串转字节数组
Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(TextBox1.Text)
'字节数组写入内存映射文件
viewAccessor.WriteArray(Of Byte)(0, data, 0, data.Length)
End Sub
二、读取窗体的代码
Dim sharedMemory As MemoryMappedFile
Dim viewAccessor As MemoryMappedViewAccessor
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'内存映射文件的名称
Dim sharedMemoryName As String = "TestSharedMemory"
'内存映射文件的大小
Dim sharedMemorySize As Integer = 1024
'使用CreateOrOpen创建或打开文件
sharedMemory = MemoryMappedFile.CreateOrOpen(sharedMemoryName, sharedMemorySize)
'创建映射到内存映射文件视图的访问器
viewAccessor = sharedMemory.CreateViewAccessor
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim data(1023) As Byte
'读取内存映射文件到字节数组
viewAccessor.ReadArray(Of Byte)(0, data, 0, 1024)
'将字节数组转字符串
Dim message As String = System.Text.Encoding.UTF8.GetString(data)
TextBox1.Text = message
End Sub
两个窗体运行后,点击写入窗体的“写入数据”按钮,再按下读取窗体的“读取数据”按钮,运行结果如下:
但是当写入数据比较少的时候,读取出的数据会存在问题,会包含上一次的多余数据:
这就需要更好的方法来写入和读取数据。
三、修改后的写入窗体的代码:
增加“写入数据改进”按钮。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'字符串转字节数组
Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(TextBox1.Text)
'sendData保存实际发送的字节数组
'实际保存的字节数组=数据大小(4)+ data(data.Length)
Dim sendData() As Byte
ReDim sendData(4 + data.Length - 1)
'前4个字节,保存了实际数据的大小
Dim headData() As Byte
headData = BitConverter.GetBytes(data.Length)
'headData拷贝到sendData
Array.Copy(headData, sendData, headData.Length)
'data拷贝到sendData,拷贝到的位置从4开始
Array.Copy(data, 0, sendData, 4, data.Length)
'字节数组写入内存映射文件
viewAccessor.WriteArray(Of Byte)(0, sendData, 0, sendData.Length)
End Sub
四、修改后的读取窗体的代码:
增加“读取数据改进”按钮。
Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
Dim data(1023) As Byte
'读取内存映射文件到字节数组
viewAccessor.ReadArray(Of Byte)(0, data, 0, 1024)
'读取前4个字节,保存了实际数据的大小
Dim headData(3) As Byte
Array.Copy(data, headData, 4)
'获取实际数据的大小
Dim dataLength As Integer
dataLength = BitConverter.ToInt32(headData, 0)
'将实际数据保存到字节数组
Dim realData(dataLength - 1) As Byte
Array.Copy(data, 4, realData, 0, dataLength)
'字节数组转字符串
Dim message As String = System.Text.Encoding.UTF8.GetString(realData)
TextBox1.Text = message
End Sub
两个窗体运行后,点击写入窗体的“写入数据改进”按钮,再按下读取窗体的“读取数据改进”按钮,运行结果如下:
可以看到此时获得的数据正常。
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。