job_2006的专栏
登录
注册
全站
当前博客
空间
博客
好友
相册
留言
job_2006
ID:job_2006
共
832
次访问,排名
2万外
好友
3
人,关注者
6
人
job_2006的文章
原创 0 篇
翻译 0 篇
转载 26 篇
评论 1 篇
最近评论
xfblue:
代码挺好用,用你的登录代码解决了登录问题,发现网上的文章都是说了一堆废话,让人摸不到头脑,原来实现如此简单...
文章分类
AjaxPro
(RSS)
asp.net
(RSS)
C#
(RSS)
JS
(RSS)
VB
(RSS)
网页优化
(RSS)
收藏
相册
博客园
存档
2008年05月(26)
软件项目交易
订阅我的博客
基于.Net3.5编写,全异步操作。支持TCP、UDP两种方式,全事件模式通知。
收藏
新一篇: GridView导出到Excel或Word文件
|
旧一篇: C# ,webBrowser,登录,数据填充,模拟点击链接,运行JS函数
'
**********************************************************************
'
适用于 .Net3.5版本
'
**********************************************************************
Imports
System.Net.Sockets
Imports
System.Net
Imports
System.Collections.Generic
Imports
System.Linq
Public
Class Socket35
Class
Socket35
自定义Socket结构体
#Region
"自定义Socket结构体"
Public
Class MySocket
Class
MySocket
Private
MyWorkSocket
As
Socket
Private
MyWorkID
As
Int32
Private
MyWorkName
As
String
'
'' <summary>
'
'' 设置工作Socket
'
'' </summary>
'
'' <value>Scoket对象</value>
'
'' <returns></returns>
'
'' <remarks></remarks>
Public
Property WorkSocket()
Property
WorkSocket()
As
Socket
Get
Return
MyWorkSocket
End
Get
Set
(
ByVal
value
As
Socket)
MyWorkSocket
=
value
End
Set
End Property
'
'' <summary>
'
'' Socket工作ID
'
'' </summary>
'
'' <value>Integer值</value>
'
'' <returns></returns>
'
'' <remarks></remarks>
Public
Property WorkID()
Property
WorkID()
As
Int32
Get
Return
MyWorkID
End
Get
Set
(
ByVal
value
As
Int32)
MyWorkID
=
value
End
Set
End Property
'
'' <summary>
'
'' Socket工作名称
'
'' </summary>
'
'' <value>String值</value>
'
'' <returns></returns>
'
'' <remarks></remarks>
Public
Property WorkName()
Property
WorkName()
As
String
Get
Return
MyWorkName
End
Get
Set
(
ByVal
value
As
String
)
MyWorkName
=
value
End
Set
End Property
End Class
#End Region
Socket协义类型
#Region
"Socket协义类型"
Public
Enum SocketType
Enum
SocketType
TCP
UDP
End Enum
#End Region
Private
SocketID
As
Int32
Private
Server
As
Socket
Private
ServerHas
As
New
HashSet(
Of
MySocket)
Private
MyReceiveBuff(), MySendBuff()
As
Byte
Public
Delegate
Sub EventHandler()
Sub
EventHandler(
ByRef
Sender
As
MySocket,
ByVal
e
As
SocketAsyncEventArgs)
'
-------------------------------------------------------------------------------------------------------------
Public
Event
OnAccept
As
EventHandler
'
客户端连接事件
Public
Event
OnReceive
As
EventHandler
'
客户端传入数据事件
Public
Event
OnDisconnected
As
EventHandler
'
客户端断开事件
Public
Event
OnSent
As
EventHandler
'
数据发送完毕
'
**********************************************************************
'
Socket对象定义、接收数据、发送数据、外部事件引发
'
**********************************************************************
构造函数
#Region
"构造函数"
'
'' <summary>
'
'' 初始化Socket35
'
'' </summary>
'
'' <param name="ProtocolType">协议类型</param>
'
'' <remarks></remarks>
Sub New()
Sub
New
(
ByVal
ProtocolType
As
SocketType)
'
复位SocketID值
SocketID
=
1
Select
Case
ProtocolType
Case
SocketType.TCP
Server
=
New
Socket(AddressFamily.InterNetwork, Sockets.SocketType.Stream, Sockets.ProtocolType.Tcp)
Case
SocketType.UDP
Server
=
New
Socket(AddressFamily.InterNetwork, Sockets.SocketType.Dgram, Sockets.ProtocolType.Udp)
End
Select
End Sub
'
'' <summary>
'
'' 初始化Socket35
'
'' </summary>
'
'' <param name="ProtocolType">协议类型</param>
'
'' <param name="ReceiveBuffLength">接收缓冲区长度</param>
'
'' <param name="SendBuffLength">发送缓冲区长度</param>
'
'' <remarks></remarks>
Sub New()
Sub
New
(
ByVal
ProtocolType
As
SocketType,
ByVal
ReceiveBuffLength
As
Int32,
ByVal
SendBuffLength
As
Int32)
'
复位SocketID值
SocketID
=
1
If
ReceiveBuffLength
<
1
OrElse
SendBuffLength
<
1
Then
Throw
New
Exception(
"
缓冲区大小必须大于0
"
,
New
OverflowException)
Exit Sub
End
If
Select
Case
ProtocolType
Case
SocketType.TCP
Server
=
New
Socket(AddressFamily.InterNetwork, Sockets.SocketType.Stream, Sockets.ProtocolType.Tcp)
Case
SocketType.UDP
Server
=
New
Socket(AddressFamily.InterNetwork, Sockets.SocketType.Dgram, Sockets.ProtocolType.Udp)
End
Select
ReceiveBuff
=
ReceiveBuffLength
SendBuff
=
SendBuffLength
End Sub
#End Region
连接服务器
#Region
"连接服务器"
'
'' <summary>
'
'' 连接到服务器端
'
'' </summary>
'
'' <param name="Ip">IP地址</param>
'
'' <param name="Port">端口</param>
'
'' <returns>MySocket对象</returns>
'
'' <remarks></remarks>
Public
Function Connect()
Function
Connect(
ByVal
Ip
As
String
,
ByVal
Port
As
Int32)
As
MySocket
Dim
MS
As
New
MySocket
'
复位SocketID值
SocketID
=
1
Server.Connect(Ip, Port)
MS.WorkID
=
SocketID
MS.WorkSocket
=
Server
ServerHas.Add(MS)
Return
MS
End Function
'
'' <summary>
'
'' 连接到服务器端
'
'' </summary>
'
'' <param name="RemotoEndPoint">远程服务器节点</param>
'
'' <returns>MySocket对象</returns>
'
'' <remarks></remarks>
Public
Function Connect()
Function
Connect(
ByVal
RemotoEndPoint
As
IPEndPoint)
As
MySocket
Dim
MS
As
New
MySocket
'
复位SocketID值
SocketID
=
1
Server.Connect(RemotoEndPoint)
MS.WorkID
=
SocketID
MS.WorkSocket
=
Server
ServerHas.Add(MS)
Return
MS
End Function
#End Region
接收缓冲区大小
#Region
"接收缓冲区大小"
'
'' <summary>
'
'' 读取或设置接收缓冲区大小
'
'' </summary>
'
'' <value></value>
'
'' <returns></returns>
'
'' <remarks></remarks>
Public
Property ReceiveBuff()
Property
ReceiveBuff()
As
Int32
Get
Return
MyReceiveBuff.Length
End
Get
Set
(
ByVal
value
As
Int32)
ReDim
MyReceiveBuff(value)
End
Set
End Property
#End Region
发送缓冲区大小
#Region
"发送缓冲区大小"
'
'' <summary>
'
'' 读取或设置发送缓冲区大小
'
'' </summary>
'
'' <value></value>
'
'' <returns></returns>
'
'' <remarks></remarks>
Public
Property SendBuff()
Property
SendBuff()
As
Int32
Get
Return
MySendBuff.Length
End
Get
Set
(
ByVal
value
As
Int32)
ReDim
MySendBuff(value)
End
Set
End Property
#End Region
绑定地址和端口
#Region
"绑定地址和端口"
'
'' <summary>
'
'' 绑定地址和端口
'
'' </summary>
'
'' <param name="Ip">Ip地址</param>
'
'' <param name="Port">端口</param>
'
'' <remarks></remarks>
Public
Overloads
Sub Bind()
Sub
Bind(
ByVal
Ip
As
String
,
ByVal
Port
As
Int32)
Server.Bind(
New
IPEndPoint(IPAddress.Parse(Ip), Port))
End Sub
'
'' <summary>
'
'' 绑定地址和端口
'
'' </summary>
'
'' <param name="IpEndPoint">Ip地址和端口的节点</param>
'
'' <remarks></remarks>
Public
Overloads
Sub Bind()
Sub
Bind(
ByVal
IpEndPoint
As
IPEndPoint)
Server.Bind(IpEndPoint)
End Sub
#End Region
侦听数
#Region
"侦听数"
'
'' <summary>
'
'' 设置侦听数
'
'' </summary>
'
'' <param name="val">侦听数</param>
'
'' <remarks></remarks>
Public
Sub Listen()
Sub
Listen(
ByVal
val
As
Int32)
Server.Listen(
val
)
End Sub
#End Region
开始侦听
#Region
"开始侦听"
'
'' <summary>
'
'' 开始侦听客户端连接
'
'' </summary>
'
'' <remarks></remarks>
Public
Sub Start()
Sub
Start()
Select
Case
Server.ProtocolType
Case
ProtocolType.Tcp
StartForTcp()
Case
ProtocolType.Udp
StartForUdp()
End
Select
End Sub
Private
Sub StartForTcp()
Sub
StartForTcp()
Dim
acc
As
New
SocketAsyncEventArgs
AddHandler
acc.Completed,
AddressOf
Accept_Completed
Server.AcceptAsync(acc)
End Sub
Private
Sub StartForUdp()
Sub
StartForUdp()
Dim
acc
As
New
SocketAsyncEventArgs
AddHandler
acc.Completed,
AddressOf
UDP_Receive_Completed
acc.RemoteEndPoint
=
Server.LocalEndPoint
acc.SetBuffer(MyReceiveBuff,
0
, MyReceiveBuff.Length)
Server.ReceiveFromAsync(acc)
End Sub
#End Region
客户端连接
#Region
"客户端连接"
Private
Sub Accept_Completed()
Sub
Accept_Completed(
ByVal
Sender
As
Object
,
ByVal
e
As
SocketAsyncEventArgs)
'
事件进入
Dim
MS
As
New
MySocket
Dim
Client
As
Socket
Client
=
e.AcceptSocket
MS.WorkID
=
SocketID
MS.WorkSocket
=
Client
RaiseEvent
OnAccept(MS, e)
If
IsNothing
(Client)
OrElse
Not
Client.Connected
Then
If
Not
IsNothing
(ServerHas)
Then
ServerHas.Remove(MS)
End
If
Exit Sub
Else
ServerHas.Add(MS)
End
If
'
接收数据
RemoveHandler
e.Completed,
AddressOf
Accept_Completed
AddHandler
e.Completed,
AddressOf
TCP_Receive_Completed
e.SetBuffer(MyReceiveBuff,
0
, MyReceiveBuff.Length)
Client.ReceiveAsync(e)
SocketID
+=
1
Start()
End Sub