-
VB.NET实现DirectPlay(2)HOST
关键字: DirectPlay DPlay VB DirectX .net 网络 游戏 作者:董含君
转贴请注明来自 http://a11s.cnblogs.com
唉,莫非我运气真的很差?
刚想发这篇文章的,结果CSDN的BLOG又挂了!
这次需要上一篇文章的设备列表.我是根据例子来的所以自然章节也是按照它来分的
写这个的目的是为了降低入门的难度.要知道看MS的例子,他用的技巧太多.没办法,人家官方发东西自然要健壮,不能被人笑话.但是我为了以后查找方便所以突出一下重点...
这次是建立一个HOST,虽然目前还不能实质的做什么,一步一步来嘛…下次就是FindHost了
1 这个还是peer. 首先new一个GUID.用来表示程序.书上说这个Guid不能随便改变.所以你生成一个guid之后建议保存下来.生成guid的方法很简单
dim guidString as string= guid.newguid().tostring
用的时候直接 dim g as new guid(guidstring) 就可以搞定
2 建立应用程序描述 就是applicationDescription 其他DX组建也有类似信息
刚才的Guid就是其中一部分.还有一个SessionFlag程序描述需要指定.无非以下值,不用翻译吧…
3 IP
new 一个 address就可以,比如 Dim mAddr As New Address("127.0.0.1", 2552)
4 Peer 直接new一个就OK了
有了address 有了 appdesc 然后直接 peer.host (address,appdesc) 一切OK,还是比较简单的.MS的例子比较复杂.经过提纯,以下部分应该有用.虽然不够健壮,但是,为了说明步骤方便理解,所以不需要他多代码影响思维.
Imports Microsoft.DirectX.DirectPlay
Public Class Form1
Inherits System.Windows.Forms.Form
Dim WithEvents p As New Peer '新的peer
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents Button1 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(32, 16)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(72, 32)
Me.Button1.TabIndex = 0
Me.Button1.Text = "HOST"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(288, 197)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
Dim g As Guid
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
g = Guid.NewGuid '生成一个新的GUID,用作标识application
Me.Text = g.ToString '这个显示在窗体标题栏
Dim mAddr As New Address("127.0.0.1", 2552)
mAddr.ServiceProvider = Address.ServiceProviderTcpIp
If IsServiceProviderValid(mAddr.ServiceProvider) = False Then
'天,还真的出问题了?
MsgBox("创建连接的时候失败了,网络设备不能用")
Exit Sub
End If
Dim appDesc As New ApplicationDescription
appDesc.GuidApplication = g '用上刚才随机生成的Guid了,当然这里仅仅是演示,要是每次都随机生成就不用连接了
appDesc.Flags = SessionFlags.NoDpnServer Or SessionFlags.RequirePassword
'以下都是其他属性的演示
appDesc.SessionName = "test"
appDesc.MaxPlayers = 10
appDesc.Password = "123" '这里没有加密,都是明文传输,记得写上SessionFlags.RequirePassword 否则会出问题
p.Host(appDesc, mAddr)
MsgBox("OK", MsgBoxStyle.OKOnly, "Test")
End Sub
Private Function IsServiceProviderValid(ByVal provider As Guid) As Boolean
'这个就是上一篇关于枚举设备的,看看这指定的设备是否能用
'虽然一般没有问题,但是MS的例子都要检查一下,所以,还是稍微重视一下吧
' Ask DirectPlay for the service provider list
Dim SPInfoArray As ServiceProviderInformation() = p.GetServiceProviders(True)
' For each service provider in the returned list...
Dim info As ServiceProviderInformation
For Each info In SPInfoArray
' Compare the current provider against the passed provider
If info.Guid.Equals(provider) Then
Return True
End If
Next info
' Not found
Return False
End Function 'IsServiceProviderValid
Protected Overrides Sub Finalize()
MyBase.Finalize()
p.Dispose()
End Sub
End Class
转贴请注明来自 http://a11s.cnblogs.com
唉,莫非我运气真的很差?
刚想发这篇文章的,结果CSDN的BLOG又挂了!
这次需要上一篇文章的设备列表.我是根据例子来的所以自然章节也是按照它来分的
写这个的目的是为了降低入门的难度.要知道看MS的例子,他用的技巧太多.没办法,人家官方发东西自然要健壮,不能被人笑话.但是我为了以后查找方便所以突出一下重点...
这次是建立一个HOST,虽然目前还不能实质的做什么,一步一步来嘛…下次就是FindHost了
1 这个还是peer. 首先new一个GUID.用来表示程序.书上说这个Guid不能随便改变.所以你生成一个guid之后建议保存下来.生成guid的方法很简单
dim guidString as string= guid.newguid().tostring
用的时候直接 dim g as new guid(guidstring) 就可以搞定
2 建立应用程序描述 就是applicationDescription 其他DX组建也有类似信息
刚才的Guid就是其中一部分.还有一个SessionFlag程序描述需要指定.无非以下值,不用翻译吧…
MEMBER |
DESCRIPTION |
---|---|
GuidApplication |
Uniquely identify your application. |
GuidInstance |
A unique identifier for your session, generated by DirectPlay. This is to identify separate instances of your application running simultaneously. |
MaxPlayers |
The maximum number of users allowed in a given session. Setting this value to zero (the default) will allow an unlimited number of players. |
CurrentPlayers |
The number of users currently in the session. |
Flags |
Used to define the session behavior, may be one or more of the following flags:
|
SessionName |
User-defined name of the session. |
Password |
The password needed to join the session. This value must be null unless the RequirePassword flag is set. |
3 IP
new 一个 address就可以,比如 Dim mAddr As New Address("127.0.0.1", 2552)
4 Peer 直接new一个就OK了
有了address 有了 appdesc 然后直接 peer.host (address,appdesc) 一切OK,还是比较简单的.MS的例子比较复杂.经过提纯,以下部分应该有用.虽然不够健壮,但是,为了说明步骤方便理解,所以不需要他多代码影响思维.
Imports Microsoft.DirectX.DirectPlay
Public Class Form1
Inherits System.Windows.Forms.Form
Dim WithEvents p As New Peer '新的peer
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents Button1 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(32, 16)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(72, 32)
Me.Button1.TabIndex = 0
Me.Button1.Text = "HOST"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(288, 197)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
Dim g As Guid
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
g = Guid.NewGuid '生成一个新的GUID,用作标识application
Me.Text = g.ToString '这个显示在窗体标题栏
Dim mAddr As New Address("127.0.0.1", 2552)
mAddr.ServiceProvider = Address.ServiceProviderTcpIp
If IsServiceProviderValid(mAddr.ServiceProvider) = False Then
'天,还真的出问题了?
MsgBox("创建连接的时候失败了,网络设备不能用")
Exit Sub
End If
Dim appDesc As New ApplicationDescription
appDesc.GuidApplication = g '用上刚才随机生成的Guid了,当然这里仅仅是演示,要是每次都随机生成就不用连接了
appDesc.Flags = SessionFlags.NoDpnServer Or SessionFlags.RequirePassword
'以下都是其他属性的演示
appDesc.SessionName = "test"
appDesc.MaxPlayers = 10
appDesc.Password = "123" '这里没有加密,都是明文传输,记得写上SessionFlags.RequirePassword 否则会出问题
p.Host(appDesc, mAddr)
MsgBox("OK", MsgBoxStyle.OKOnly, "Test")
End Sub
Private Function IsServiceProviderValid(ByVal provider As Guid) As Boolean
'这个就是上一篇关于枚举设备的,看看这指定的设备是否能用
'虽然一般没有问题,但是MS的例子都要检查一下,所以,还是稍微重视一下吧
' Ask DirectPlay for the service provider list
Dim SPInfoArray As ServiceProviderInformation() = p.GetServiceProviders(True)
' For each service provider in the returned list...
Dim info As ServiceProviderInformation
For Each info In SPInfoArray
' Compare the current provider against the passed provider
If info.Guid.Equals(provider) Then
Return True
End If
Next info
' Not found
Return False
End Function 'IsServiceProviderValid
Protected Overrides Sub Finalize()
MyBase.Finalize()
p.Dispose()
End Sub
End Class
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式