网站建设资讯

NEWS

网站建设资讯

vb.net局域网广播 局域网屏幕广播

求一个VB.NET进行局域网内UDP广播的源代码例子

给你个udp多播例子,广播不是很清楚,呵呵

创新互联建站主要从事网站设计、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务吕梁,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575

Imports System.Net

Imports System.Net.Sockets

Imports System.Text

Public Class Form1

Inherits System.Windows.Forms.Form

Dim port As String

Dim ipadd As String

Dim ipend As IPEndPoint

Dim sendudp As New UdpClient()

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles Button1.Click

Dim ipadress As IPAddress

ipadress = IPAddress.Parse(TextBox1.Text)

'sendport = Int32.Parse(TextBox2.Text)

'ipend = New IPEndPoint(ipadress, sendport)

Try

sendudp.JoinMulticastGroup(ipadress)

MessageBox.Show("启动完成!")

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

End Sub

vb的UDP广播

方案:

所有的CLIEN的WINSOCK全用控件数组。

如:

CLIENT(0)

然后在要广播的时候

sub BroadCoast()

for I =0 to client.count-1

if client(i).state=7 then

client(i).senddata

end if

next

end sub

给你帖一个我的游戏服务器代码:

Private Sub Command1_Click()

Dim intI As Integer

For I = 0 To 最大人数

If Ws(I).State 0 Then Ws(I).Close

Next

End

End Sub

Private Sub Command2_Click()

Dim TheIndex As Long

Dim Response

TheIndex = CLng(LsUser.ListIndex)

If TheIndex = -1 Then Exit Sub

Response = MsgBox("真的要把用户" 用户(CInt(TheIndex)).用户名 "删除下线吗?" TheIndex, vbOKCancel + vbQuestion)

If Response = vbOK Then

Dim KillReson As String

KillReson = InputBox("请输入踢用户下线的理由:", "踢用户下线", "")

If Len(KillReson) = 0 Then Exit Sub

FrmMain.Ws(TheIndex + 1).SendData Encrypt("444$" KillReson, LngKeyE, LngKeyD, LngKeyN)

DoEvents

'Call KillUser(CInt(TheIndex))

Else

Exit Sub

End If

End Sub

Private Sub Command3_Click()

Dim I, K As Long

For I = 0 To LsUser.ListCount - 1

'If Trim(LsUser.Text) = 用户(I + 1).用户名 And 用户(I + 1).用户状态 = 0 Then

' LsUser.RemoveItem I + 1

' End If

For K = 1 To 最大人数

If Trim(LsUser.List(I)) = 用户(K).用户名 And 用户(K).用户状态 = 0 Then

LsUser.RemoveItem CInt(用户(K).在线列表号)

End If

Next

Next

Labonline.Caption = "当前在线:" LsUser.ListCount "人"

End Sub

Private Sub Form_Load()

Dim I As Long

最大人数 = 5

当前连接号 = 1

For I = 2 To 最大人数

Load Ws(I)

DoEvents

Next

WsListen.LocalPort = "1982"

WsListen.Listen

DeBugs ("服务器已经准备就绪" vbCrLf "共加载个" 最大人数 "连接" vbCrLf "服务IP:" WsListen.LocalIP vbCrLf "端口:" WsListen.LocalPort)

Call ConnData

Me.Show

End Sub

Private Sub Form_Unload(Cancel As Integer)

For I = 1 To 最大人数

If Ws(I).State 0 Then

Ws(I).Close

End If

Next

End Sub

Private Sub LsUser_Click()

Dim strTheU, Uindex() As String

strTheU = Trim(LsUser.Text)

strTheU = "用户名:" 用户(CLng(LsUser.ListIndex + 1)).用户名 vbCrLf

strTheU = strTheU "昵 称:" 用户(CLng(LsUser.ListIndex + 1)).昵称 vbCrLf

strTheU = strTheU "积分:" 用户(CLng(LsUser.ListIndex + 1)).积分 vbCrLf

strTheU = strTheU "胜:" 用户(CLng(LsUser.ListIndex + 1)).胜 vbCrLf

strTheU = strTheU "败:" 用户(CLng(LsUser.ListIndex + 1)).败 vbCrLf

strTheU = strTheU "团 队:" 用户(CLng(LsUser.ListIndex + 1)).团队名 vbCrLf

strTheU = strTheU "职 务:" 用户(CLng(LsUser.ListIndex + 1)).职务 vbCrLf

strTheU = strTheU "IP:" 用户(CLng(LsUser.ListIndex + 1)).IP vbCrLf

strTheU = strTheU "连接号:" 用户(CLng(LsUser.ListIndex + 1)).连接号 vbCrLf

strTheU = strTheU "用户状态:" 用户(CLng(LsUser.ListIndex + 1)).用户状态 vbCrLf

Lu.Caption = strTheU

End Sub

Private Sub Ws_Close(Index As Integer)

Ws(Index).Close

用户(Index).用户状态 = 0

Call RemoteUser(CLng(Index))

DeBugs ("用户:" 用户(Index).用户名 "离开了游戏")

End Sub

Private Sub Ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)

Dim sData As String

Dim ClsData As New Data

If bytesTotal = 0 Then

MsgBox "收到的数据为空"

Ws(Index).Close: Exit Sub

End If

Ws(Index).GetData sData, vbString

DoEvents

Call ClsData.DataControl(sData, Index)

DeBugs ("收到包:" sData)

End Sub

Private Sub Ws_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

DeBugs (Err.Description)

End Sub

Private Sub WsListen_ConnectionRequest(ByVal requestID As Long)

Dim I As Long

'//首先按顺序接收请求.

For I = 当前连接号 To 最大人数

If Ws(I).State = 0 Then

Ws(I).Accept requestID

DeBugs ("接收到远程用户的连接请求(" Ws(I).RemoteHostIP ")")

当前连接号 = I

Exit For

End If

Next

'///如果按顺序没有空连接,则查看前面有没有退出的用户

If I = 最大人数 Then

For I = 1 To 当前连接号

If Ws(I).State = 0 Then

Ws(I).Accept requestID

Else

'WsBusy.Accept requestID

' If WsBusy.State = 7 Then

'WsBusy.SendData "服务已经满了...."

'WsBusy.Close

' End If

End If

Next

End If

End Sub

Sub DeBugs(Str)

txtDebug.Text = txtDebug.Text Str vbCrLf

End Sub

Public Function Login(Index As Integer, UserName As String, UserPass As String) As String

If UserName = "" Or UserPass = "" Then Login = Encrypt("999$用户名密码不能为空", "", "", "")

Dim strSql As String

Dim RsLogin As New ADODB.Recordset

strSql = "select sex,score,win,lose,groups,positions,pic,nick,lastlogintime from [user] where username='" UserName "' and userPass='" UserPass "'"

If RsLogin.State = 1 Then RsLogin.Close

RsLogin.Open strSql, Conn, 1, 3

If RsLogin.EOF Or RsLogin.BOF Then

Login = Encrypt("404$用户名或是密码错误", "", "", "")

Else

RsLogin("LastLoginTime") = Now

Dim K As Integer

Dim Plain() As String

'性别+积分+胜+输+团队+职务+头像+昵称

Ustr(Index) = ""

For K = 0 To RsLogin.Fields.Count - 1

Ustr(Index) = Ustr(Index) RsLogin(K) "$"

Next

Plain = Split("$" Ustr(Index), "$")

With 用户(Index)

.连接号 = Index

.用户名 = UserName

.密码 = UserPass

.用户状态 = 1

.头像 = Plain(7)

.胜 = Plain(3)

.败 = Plain(4)

.昵称 = Plain(8)

.团队名 = Plain(5)

.职务 = Plain(6)

.积分 = Plain(2)

.性别 = Plain(1)

.IP = Ws(Index).RemoteHostIP

End With

LsUser.AddItem UserName

用户(Index).在线列表号 = LsUser.ListCount - 1

LsUser.Refresh

Labonline.Caption = "共有" LsUser.ListCount "人在线"

Login = "20$" Ustr(Index) "$" 用户(Index).连接号

End If

' If RsLogin.State = 1 Then RsLogin.Close

End Function

Public Sub KillUser(Index As Integer)

If Index 0 Then Exit Sub

Ws(Index + 1).Close

用户(Index + 1).用户状态 = 0

Call RemoteUser(Index + 1)

End Sub

Public Sub RemoteUser(Index As Integer)

' On Error Resume Next

If Index = -1 Then Exit Sub

Dim I As Long

For I = 0 To LsUser.ListCount - 1

If Trim(LsUser.List(I)) = Trim(用户(Index).用户名) Then

LsUser.RemoveItem I

LsUser.Refresh

Labonline.Caption = "共有" LsUser.ListCount "人在线"

'Exit For

End If

Next

End Sub

Public Function OnlineUser(Index As Integer, Hall As Integer)

Dim I As Long

Dim strOnUser As String

For I = 0 To 最大人数

If 用户(I).游戏ID = Hall And Len(用户(I).用户名) 0 And 用户(I).连接号 Index And 用户(I).用户状态 = 1 Then

OnUser = OnUser "###" 用户(I).所在桌 "$" 用户(I).所在座 "$" Ustr(I) "$" 用户(I).用户名 "$" 用户(I).连接号 "$" 用户(I).IP

FrmMain.DeBugs ("user:" I "GameId:" 用户(I).游戏ID ";username:" 用户(I).用户名 ";Connectnum:" 用户(I).连接号 ";userstaus:" 用户(I).用户状态 "----send")

Else

FrmMain.DeBugs ("user:" I "GameId:" 用户(I).游戏ID ";username:" 用户(I).用户名 ";Connectnum:" 用户(I).连接号 ";userstaus:" 用户(I).用户状态 "----not send")

End If

DoEvents

Next

'///报头+1房间ID+2桌+3坐+4性别+5积分+6胜+7输+8团队+9职务+10头像+11上次LOGON时间+12昵称+13用户名+14连接号+15ip

OnlineUser = "4000$" Hall "$" OnUser

End Function

求vb代码,vb实现以广播的形式发送信息到局域网内部,另外加一个接收的程序。

这代码发送和接收的MSDN6.0中有,在索引中键入winscok 控件,点使用 Winsock 控件

其中关于UDP

协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。

要创建一个 UDP 伙伴,请按照以下步骤执行:

创建一个新的 Standard EXE 工程。

将缺省的窗体的名称修改为 frmPeerA。

将窗体的标题修改为“Peer A”。

在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerA。

在“属性”页上,单击“协议”并将协议修改为 UDPProtocol。

在窗体中添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。

为窗体增加如下的代码。

Private Sub Form_Load()

'控件的名字为 udpPeerA

With udpPeerA

'重点:必须将 RemoteHost 的值

'修改为计算机的名字。

.RemoteHost= "PeerB" 

.RemotePort = 1001   '连接的端口号。

.Bind 1002                '绑定到本地的端口。

End With

frmPeerB.Show                 '显示第二个窗体。

End Sub

Private Sub txtSend_Change()

'在键入文本时,立即将其发送出去。

udpPeerA.SendData txtSend.Text

End Sub

Private Sub udpPeerA_DataArrival _

(ByVal bytesTotal As Long)

Dim strData As String

udpPeerA.GetData strData

txtOutput.Text = strData

End Sub

要创建第二个 UDP 伙伴,请按照以下步骤执行:

在工程中添加一个标准窗体。

将窗体的名字修改为 frmPeerB。

将窗体的标题修改为“Peer B”。

在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerB。

在“属性”页上,单击“协议”并将协议修改为“UDPProtocol”。

在窗体上添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。

在窗体中添加如下的代码。

Private Sub Form_Load()

'控件的名字为 udpPeerB。

With udpPeerB

'重点:必须将 RemoteHost 的值改为

'计算机的名字。

.RemoteHost= "PeerA"

.RemotePort = 1002    '要连接的端口。

.Bind 1001                '绑定到本地的端口上。

End With

End Sub

Private Sub txtSend_Change()

'在键入后立即发送文本。

udpPeerB.SendData txtSend.Text

End Sub

Private Sub udpPeerB_DataArrival _

(ByVal bytesTotal As Long)

Dim strData As String

udpPeerB.GetData strData

txtOutput.Text = strData

End Sub

VB6.0的winsock控件用UDP局域网广播数据,当数据很大时接收方报10040--数据包太大,请问怎么处理。

虽然很久没用这控件了,不过原理还是懂的,给你点思路吧

解决你的问题,大概有几个方法:

一.控制发送速度,简单但是效率有点低

二.技术方加大数据缓冲,优先接收,读了就放内存里,接收完或是空闲时再处理,这在处理过程复杂时比较有效

三.出错的数据丢掉----没错,就是不要了!

既然你选择了UDP,就无法避免丢包的事情发生,肯定要有相关的容错处理.网络可以"自动"丢包,我们写的程序为什么不能"人为"丢包呢?

其实,多数情况下,要根据所处理数据的特点 当前网络特点 机器现状来制定策略,综合上述办法,甚至创造更新的办法

以上,希望对你有帮助,还有问题欢迎探讨


网站名称:vb.net局域网广播 局域网屏幕广播
网页地址:http://cdweb.net/article/hhioos.html