MultiLink的WinSock Server程式我们要先有一个观念,在VB中,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
TO hsghxm(呵本) 感谢你的回复,但是我想知道的是如下问题:1、服务端程序采用 winsock 控件数组(使用TCP协议),多个用户(例如10个)同时发送请求给服务端程序,服务端程序是否可以同时响应10个用户的请求? 2、winsock 控件是多线程吗? 3、如果 winsock 控件数组是多线程,如何写程序才可以作到同时处理多用户的请求?
连结,要有多个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
2、winsock 控件是多线程吗?
3、如果 winsock 控件数组是多线程,如何写程序才可以作到同时处理多用户的请求?
qq.24508609
winsock一个sock就是一条独立的线程
但并不是多线程。
的同步! Cpu在单一时刻只能做一件事 所以同步只能算的上是宏观意义上的同步!
任何进程都要在CPU处排队.控件也要在内存中排队.发送也要排队.专业服务器也要排队滴...虽然他用了多颗CPU和大容量内存来做处理和缓冲..但是还是要排队滴....
不过.CPU的处理不是根据进程来的,是根据管线来的.
数组+技巧.
我的扫描器就是这样搞出来的.速度快.且简单.
一次创建1000个控件扫描,扫出一个断开,卸载掉,超时一个断开,卸载掉,与此同时使用循环Load新的控件.利用循环的套嵌可以实现.
自己琢磨吧.很简单.
应该是你的程序写烂了..根本就不忧,我写的sock代替sql远程访问数据据还是比较快的..这个时候效率问题就要注重了..
这些你基本上不用担心2、winsock 控件是多线程吗?
可以这么看.3、如果 winsock 控件数组是多线程,如何写程序才可以作到同时处理多用户的请求?
这个是需要你去理解.