MultiLink的WinSock Server程式1.一个WinSock 控制项(当Server)只能连结一个Client端的需求,所以Server要变成可多重 连结,要有多个WinSock控制项,我们也可以使用Load 指令来动态产生 2.Server端必须设定好一个Local Port 当作其Listen的Port,所有Client端的RemotePort要 指定Server 当Listen的Port Number,以本例来说,我设定3128当作Server Listen的 Port,而我的程式中有一个WinSock Control (Winsock1(0))专门做Listen的动作。在本 例中,我只允许有4个Cllient同时连上来,所以我在Form Load时,便动态产生4个 WinSock ,含Listen 的那一个一共5个WinSock Control。 3.在Server端,如果ConnectionRequest Event产生了,代表有Client端提出需求,这时 候,我们要选取一个没有使用的WinSock Control来和Client连。 4.我们在Client中,设定LocalPort = 0 代表会选取一个空着的Port来和Server的Port来连 在Server中 Winsock1(i).Accept requestID 便会自动为我们做这件事;这时,我们会看 到Server端的会Assign一个RemotePort,而Client也会Assign一个LocalPort,这次的连 线便是透过这组连线管道来做该程式请将Client的程式做成.Exe再来重覆行,且Server的程式同时也要执行,当Client 端的Text1.Text = "Close" 来送给Server时,告知Server该Connection 可结束 其他相关的知识请查Help或其他书注: GetData方法 的第一个叁数 :如果传回的资料是String则宣告成String,若告成Variant 在VB环境下没问题,但变成.exe後会有错(Automation Error);当然,若传的是Binary 的资料,那就使用ByteArray来做 '以下是Server端程式,需一个ListBox,一个WinSock控制项 Option ExplicitPrivate Sub Form_Load() Load Winsock1(1) Load Winsock1(2) Load Winsock1(3) Load Winsock1(4)Winsock1(0).LocalPort = 3128 '设定Listen的Port是3128,请自行改成您的电脑没冲突的号码 Winsock1(0).Listen End SubPrivate Sub Form_Unload(Cancel As Integer) Dim i As Long For i = 0 To 4 Winsock1(i).Close Next Unload Winsock1(1) Unload Winsock1(2) Unload Winsock1(3) Unload Winsock1(4) End SubPrivate Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long) Dim i As Long For i = 1 To 4 If Winsock1(i).State = sckClosed Then Winsock1(i).Accept requestID List1.AddItem "Local Port=" + Str(Winsock1(i).LocalPort) + " RemotePort = " + Str(Winsock1(i).RemotePort) Exit For End If Next End SubPrivate Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long) 'Dim mydata As Variant Dim mydata As String '注:如果传回的资料是String则宣告成String,若告成Variant '在VB环境下没问题,但变成.exe後会有错(Automation Error) Winsock1(Index).GetData mydata, vbString List1.AddItem "From Socket" + Str(Index) + " " + mydata Winsock1(Index).SendData "WinSock" + Str(Index) + "Reply" If mydata = "Close" Then Winsock1(Index).Close End If End Sub '以下是Client端程式,需一个ListBox,一个WinSock控制项,三个Command Button '与一个TextBox用来传资料, Option ExplicitPrivate Sub Command1_Click() Winsock1.LocalPort = 0 '以便自动产生Local Port Winsock1.Connect "140.116.253.247" '设定改成您 Server 电脑的IP 号码 End SubPrivate Sub Command2_Click() Winsock1.SendData "Close" '通知Server端Close DoEvents Winsock1.Close End SubPrivate Sub Command3_Click() Winsock1.SendData Text1.Text End SubPrivate Sub Form_Load() Winsock1.RemotePort = 3128 '设定与Server端做Listen的Port相同 Command1.Caption = "Connect" Command2.Caption = "Close" Command3.Caption = "Send" List1.Clear End SubPrivate Sub Form_Unload(Cancel As Integer) If Winsock1.State <> sckClosed Then Winsock1.SendData "Close" DoEvents Winsock1.Close Winsock1.LocalPort = 0 End SubPrivate Sub Winsock1_Connect() If Winsock1.State = sckConnected Then List1.AddItem "Connected! LocalPort =" + Str(Winsock1.LocalPort) + " RemptePort = " + Str(Winsock1.RemotePort) End IfEnd SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim mydata As String Winsock1.GetData mydata, vbString List1.AddItem mydata End SubPrivate Sub Winsock1_Error(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) List1.AddItem Description End Sub
[email protected]
控件数组:
可以拖一个控件,然后选择它,然后Ctrl+C复制,然后再粘贴,系统就会回是否该控件已经存在,是否创建控件数组?选择是。然后就创建成功了。
连结,要有多个WinSock控制项,我们也可以使用Load 指令来动态产生
2.Server端必须设定好一个Local Port 当作其Listen的Port,所有Client端的RemotePort要
指定Server 当Listen的Port Number,以本例来说,我设定3128当作Server Listen的
Port,而我的程式中有一个WinSock Control (Winsock1(0))专门做Listen的动作。在本
例中,我只允许有4个Cllient同时连上来,所以我在Form Load时,便动态产生4个
WinSock ,含Listen 的那一个一共5个WinSock Control。
3.在Server端,如果ConnectionRequest Event产生了,代表有Client端提出需求,这时
候,我们要选取一个没有使用的WinSock Control来和Client连。
4.我们在Client中,设定LocalPort = 0 代表会选取一个空着的Port来和Server的Port来连
在Server中 Winsock1(i).Accept requestID 便会自动为我们做这件事;这时,我们会看
到Server端的会Assign一个RemotePort,而Client也会Assign一个LocalPort,这次的连
线便是透过这组连线管道来做该程式请将Client的程式做成.Exe再来重覆行,且Server的程式同时也要执行,当Client
端的Text1.Text = "Close" 来送给Server时,告知Server该Connection 可结束
其他相关的知识请查Help或其他书注: GetData方法 的第一个叁数 :如果传回的资料是String则宣告成String,若告成Variant
在VB环境下没问题,但变成.exe後会有错(Automation Error);当然,若传的是Binary
的资料,那就使用ByteArray来做
'以下是Server端程式,需一个ListBox,一个WinSock控制项
Option ExplicitPrivate Sub Form_Load()
Load Winsock1(1)
Load Winsock1(2)
Load Winsock1(3)
Load Winsock1(4)Winsock1(0).LocalPort = 3128 '设定Listen的Port是3128,请自行改成您的电脑没冲突的号码
Winsock1(0).Listen
End SubPrivate Sub Form_Unload(Cancel As Integer)
Dim i As Long
For i = 0 To 4
Winsock1(i).Close
Next
Unload Winsock1(1)
Unload Winsock1(2)
Unload Winsock1(3)
Unload Winsock1(4)
End SubPrivate Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim i As Long
For i = 1 To 4
If Winsock1(i).State = sckClosed Then
Winsock1(i).Accept requestID
List1.AddItem "Local Port=" + Str(Winsock1(i).LocalPort) + " RemotePort = " + Str(Winsock1(i).RemotePort)
Exit For
End If
Next
End SubPrivate Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
'Dim mydata As Variant
Dim mydata As String '注:如果传回的资料是String则宣告成String,若告成Variant
'在VB环境下没问题,但变成.exe後会有错(Automation Error)
Winsock1(Index).GetData mydata, vbString
List1.AddItem "From Socket" + Str(Index) + " " + mydata
Winsock1(Index).SendData "WinSock" + Str(Index) + "Reply"
If mydata = "Close" Then
Winsock1(Index).Close
End If
End Sub '以下是Client端程式,需一个ListBox,一个WinSock控制项,三个Command Button
'与一个TextBox用来传资料,
Option ExplicitPrivate Sub Command1_Click()
Winsock1.LocalPort = 0 '以便自动产生Local Port
Winsock1.Connect "140.116.253.247" '设定改成您 Server 电脑的IP 号码
End SubPrivate Sub Command2_Click()
Winsock1.SendData "Close" '通知Server端Close
DoEvents
Winsock1.Close
End SubPrivate Sub Command3_Click()
Winsock1.SendData Text1.Text
End SubPrivate Sub Form_Load()
Winsock1.RemotePort = 3128 '设定与Server端做Listen的Port相同
Command1.Caption = "Connect"
Command2.Caption = "Close"
Command3.Caption = "Send"
List1.Clear
End SubPrivate Sub Form_Unload(Cancel As Integer)
If Winsock1.State <> sckClosed Then
Winsock1.SendData "Close"
DoEvents
Winsock1.Close
Winsock1.LocalPort = 0
End SubPrivate Sub Winsock1_Connect()
If Winsock1.State = sckConnected Then
List1.AddItem "Connected! LocalPort =" + Str(Winsock1.LocalPort) + " RemptePort = " + Str(Winsock1.RemotePort)
End IfEnd SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim mydata As String
Winsock1.GetData mydata, vbString
List1.AddItem mydata
End SubPrivate Sub Winsock1_Error(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)
List1.AddItem Description
End Sub