在 VisualBasic.NET 中使用命名管道进行进程间通信(vb.net lin49
机器译文: http://support.microsoft.com/kb/871044 英文原文: http://support.microsoft.com/kb/871044/en-us/ 这个篇文章内容详细,特别是操作部分,内容也简单易懂.
一. 概要
本文讨论如何在 MicrosoftVisualBasic.NET 或 Microsoft Visual Basic 2005 中使用命名管道进行进程间通信。 本文包含代码示例通过在 VisualBasic.NET 或 Visual Basic 2005 中使用命名管道, 说明客户 / 服务器通信。 本文介绍进程间通信来创建命名管道服务器和命名管道客户。 通过管道通信通过以下方式执行:
二. 介绍 命名管道是单向或双面管道管道服务器和一个或多个管道客户之间进行通信。 您可以命名管道用户能够提供同一计算机上进程之间或通过网络不同计算机上进程之间通讯。 术语 " 命名管道服务器 " 指向过程创建命名管道和术语 " 命名管道客户 " 指到一个进程, 连接到的命名管道实例。 三. 要求
本文假定您已熟悉以下主题:
以下列表概括了推荐硬件、 软件、 网络结构,以及 ServicePack, 您需要:
四. 创建命名管道服务器 创建命名管道服务器,并通过管道,然后与客户通信请按照下列步骤:
4.1 Windows 应用程序, 创建命名管道服务器 要设计 Windows 应用程序, 通过使用 VisualBasic.NET 或 Visual Basic 2005,创建命名管道服务器请按照下列步骤操作:
4.2 将所有声明添加到 Windows 应用程序中的模块 为了使用命名管道实现进程间的通信,添加的这些函数声明都是必要的,请按照下列步骤:
4.3 编写代码来创建一个命名管道服务器 创建命名管道后,等待来自客户端的连接。 当客户端连接到服务器,在管道上读取或写入数据。 要这样做,请按照下列步骤操作:
五. 创建命名管道客户 要创建与服务器通信的命名管道客户端,请按照下列步骤操作:
你也可以使用命名管道事务用于客户/服务器 通信上。这个命名管道事务在一次单独的网络操作中结合了写操作和读操作。命名管道事务只能用于双向,消息模式的管道上. 进程能够调用 TransactNamedPipe 函数或 CallNamedPipe函数实现命名管道事务. 5.1 设计与命名管道服务器通信的 Windows 应用程序 要设计用于连接到命名管道服务器,的VisualBasic.NET 或 Visual Basic 2005 Windows 应用程序,请按照下列步骤操作:
5.2 编写代码连接到命名管道服务器 通过使用 CallNamedPipe 函数连接到命名管道服务器。 连接到服务器后,CallNamedPipe 函数把数据写入管道,从管道读取数据, 然后关闭管道。 要连接到服务器,然后读取或写入数据,请按照下列步骤操作:
六. 验证代码工作
要验证代码工作,请按照下列步骤:
七. 参考
请,有关访问下列 Microsoft Developer Network (MSDN) Web 站点:
命名管道
http://msdn2.microsoft.com/en-us/library/aa365590.aspx (http://msdn2.microsoft.com/en-us/library/aa365590.aspx)
命名管道上事务
http://msdn2.microsoft.com/en-us/library/aa365789.aspx (http://msdn2.microsoft.com/en-us/library/aa365789.aspx)
管道函数
http://msdn2.microsoft.com/en-us/library/aa365781.aspx (http://msdn2.microsoft.com/en-us/library/aa365781.aspx) 这篇文章中的信息适用于:
---------------------------------------------------------可爱的分割线------------------------------------------------------------- 我测试的系统是 XP sp3,IDE 是vs2005,开发语言是VB.NET() 这里写一些我自己的补充,主要是对客户端的. 1. 首先是 在Button1_Click事件中添加 If TextBox1.Text = "" Then 我老是不注意输入 TextBox1 的值,所以在代码里添加一个默认值,在设计图里面加也行. 2. MessageBox.Show("Value must be at least 0.",MsgBoxStyle.OkOnly) 如果报错,改为 MessageBox.Show("Value must be at least 0.",MsgBoxStyle.OkOnly.ToString) 类似情况同样处理 3. 如果想用CreateFile,ReadFile,WriteFile 和 CloseHandle 函数,就要注意看我下面的内容啦(用了一天的时间呢,以前都没学过VB) 一些常量的声明: Private Const GENERIC_READ = &H80000000 函数的声明: Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String,_
Declare Function WriteFile Lib "kernel32"(ByVal hFile As Integer,_ Declare Function CloseHandle Lib "kernel32"(ByVal hObject As Integer) As Integer 其中要注意几点,ReadFile 函数的第二个参数类型定义跟服务器的有点不同,其他都一样; 如果你用的开发语言是VB,而非VB.NET,请把里面所有的 Integer 改为 Long. ReadFile 和 WriteFile 函数的第二个参数ByRef lpBuffer As Byte,可以改为其他类型的,如Integer 或 String等,显而易见就是传送和接收的数据的类型可以多样的,可以重载多个ReadFile 和 WriteFile 函数. 如: Declare Function WriteFile Lib "kernel32"(ByVal hFile As Integer,ByRef lpBuffer As Byte,_ Declare Function WriteFile Lib "kernel32"(ByVal hFile As Integer,ByRef lpBuffer As Integer,_ 函数的应用: 管道句柄 = CreateFile(管道名,GENERIC_READ Or GENERIC_WRITE,OPEN_EXISTING,0) '参数不能乱改,OPEN_EXISTING 这一项是固定的 管道句柄 为 -1 的话,表示连接不成功 res = ReadFile(管道句柄,bArray(0)(已经定义的一个字节数组,用于接收数据),numBytes(读取的最大字节数),cbRead(已经读取的字节数),0) res 为 0 的话,表示读取数据出错 如果字节数组没初始化,用 ReDim bArray(numBytes)
res = WriteFile(管道句柄,Buffer(已经定义的一个字节数组,用于发送的数据),byteCount(写入的最大字节数),cbnCount(已写入的字节数),0)
CloseHandle(管道句柄) '关闭管道,结束与服务器的连接; 服务器端调用这个方法,将结束整个命名通道服务. openMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGH dwOpenMode:为命名管道打开的模式,有PIPE_ACCESS_DUMPLEX(双向)、PIPE_ACCESS_INBOUND(输入)、PIPE_ACCESS_OUTBOUND(输出)这三种,这些标志还可以和一些附加的I/O控制和安全模式的常数组合使用,详细可参考MSDN。 --------------------------------------------------可爱的分割线------------------------------------------------------------------------------ 呵呵,这个例子重点是告诉你怎么在两个进程间建立命名管道进行通信,对通信的结果没提及到. 我是看不懂结果的,开始的时候连想做简单的字符串通信都做不到. 抛开其他的不说,如果连传送"你好,hello world!" 都做不到那怎么行呢! 第一次传送测试结果我用字符串显示是乱码,依我的经验这个应该是编码的问题,但是我不知道他原来的字符串的编码,用Default的Encoding都不行. 如果是这样的话,那我自己指定编码(gb2312,Default也可以)就行了,传送还是用字节数组,接收也是用字节数组,传送方可以把传送的字节的数组的长度先传送过去,接收方根据这个长度接收数据(现在的情况是数据是顺序传输的,如果在某些情况下不是这样,可以就要一个一个字节的传了). 传送方传送数据 Dim msg As String = "" msg = "你好,hello world!" msgBuffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(msg) msgLength = msgBuffer.Length '注意不要用msg.length,如果有中文,长度将不正确 发送方接收数据 res = ReadFile(hpipe,msgLength,0) msg = System.Text.Encoding.GetEncoding("gb2312").GetString(bArray) 一个一个字节地读,直到换行或者接收结束 Do Array.Clear(tempBuffer,tempBuffer.Length) If res = 0 Then bArray(iii) = tempBuffer(0) msg = System.Text.Encoding.Default.GetString(bArray) If (msg.IndexOf("/r/n") > -1) Then Loop Until (isLine Or isEnd) 呵呵,搞定! 上面的基本是用学的java 经验写的,对于 vb.net 不是很了解,可能有更好的方法呢 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |