放分!! + .NET Socket 编程简单例子!! 不来的吃亏了别怪我!
比较完整的代码片断:
(只包括服务端的打开操作,不包括关闭,也不包括客户端)
(还有,这个是根据我的一个程序改编的,如有错误,可能是改的时候改错了,跟我说一声,我再来看看)
Imports System.Net
Imports System.Net.Sockets
Public Class Form1
Private mListener As Socket
Protected mSocks As New ArrayList()
Protected DataBuff(1048576) As Byte
... '其它代码
Sub New()
...
InitListener()
End Sub
... '其它代码
Protected Overridable Sub InitListener()
mListener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
With mListener
.Bind(New IPEndPoint(IPAddress.Parse(ServIP), ServPort))
.Listen(40)
.BeginAccept(AddressOf Accepted, mListener)
End With
End Sub
Protected Overridable Sub Accepted(ByVal ar As IAsyncResult)
Dim tmp As Socket()
tmp = mListener.EndAccept(ar)
mSocks.Add(tmp)
tmp.BeginReceive(DataBuff, 0, 4, SocketFlags.None, AddressOf Received, mListener)
mListener.BeginAccept(AddressOf Accepted, mListener)
End Sub
Protected Overridable Sub Received(ByVal ar As IAsyncResult)
Dim i As Integer
Dim j As Integer
Dim tmp As Socket
tmp = CType(ar.AsyncState, Socket)
If tmp Is Nothing Then Return
If JoinBag(tmp) = False Then Return ' 为了安全,传送数据时第一个4 Bytes
' 用于指出本次传送有多少Bytes的数据
' 对此,用JoinBag(tmp As Socket) 函数保证数据的完整
' 调用完该函数时数据已经全部接收完毕,可以对接收的数据进行操作。
... '数据处理
tmp.BeginReceive(DataBuff, 0, 4, SocketFlags.None, AddressOf Received, mReceived_AsyncResult)
' 继续等待接收下一组数据
End Sub
Protected Overridable Function JoinBag(ByVal Sock As Socket) As Boolean
Dim ReceivedLength, BagLength As Integer
With Sock
ReceivedLength = .EndReceive(Sock)
If ReceivedLength = 0 Then '接收到0长度的数据包!非法!
.Close()
Return False
End If
BagLength = ConvToInt(DataBuff, 0)
If BagLength > DataBuff.Length Then
ReDim Preserve DataBuff(BagLength)
End If
Do Until ReceivedLength >= BagLength
ReceivedLength += .Receive(DataBuff, ReceivedLength, BagLength - ReceivedLength, SocketFlags.None)
Loop
End With
Return True
End Function
Public Function ConvToInt(ByVal Arr() As Byte, ByRef StartsAt As Integer) As Integer
Dim i As Integer, l As Integer
l = 0
For i = StartsAt + 3 To StartsAt Step -1
l *= 256
l += Arr(i)
Next
StartsAt += 4
Return CInt(l And &HFFFFFFFF)
End Function
... '其它代码
End Class