你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
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 Explicit

Private 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 Sub

Private 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 Sub

Private 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 Sub

Private 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 Explicit

Private Sub Command1_Click()
Winsock1.LocalPort = 0	'以便自动产生Local Port
Winsock1.Connect  "140.116.253.247" '设定改成您 Server 电脑的IP 号码
End Sub

Private Sub Command2_Click()
Winsock1.SendData  "Close"  '通知Server端Close
DoEvents
Winsock1.Close
End Sub

Private Sub Command3_Click()
Winsock1.SendData Text1.Text
End Sub

Private Sub Form_Load()
Winsock1.RemotePort = 3128  '设定与Server端做Listen的Port相同
Command1.Caption = "Connect"
Command2.Caption = "Close"
Command3.Caption = "Send"
List1.Clear
End Sub

Private Sub Form_Unload(Cancel As Integer)
If Winsock1.State <> sckClosed Then
   Winsock1.SendData  "Close"
   DoEvents
   Winsock1.Close
   Winsock1.LocalPort = 0
End Sub

Private Sub Winsock1_Connect()
If Winsock1.State = sckConnected Then
   List1.AddItem "Connected! LocalPort =" + Str(Winsock1.LocalPort) + " RemptePort = " + Str(Winsock1.RemotePort)
End If

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim mydata As String
Winsock1.GetData mydata, vbString
List1.AddItem mydata
End Sub

Private 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
(编辑:aniston)
  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089