| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
VB网络编程入门
作者:未知    文章来源:网络    点击数:    更新时间:2006-8-15
  如今,网络编程可谓如火如荼了,我们作为编程迷能坐在那里稳如泰山吗?当然不能。

  但是网络编程又是一个神秘莫测的地带,涉及到什么TCP/IP等之类的专业术语。的确,在以前,没有极深厚的专业基础是不敢涉足网络编程的。不过,一切都在成为过去。VB自从5.0以后的版本提供了非常简便的Internet控件,复杂的技术细节都封装在控件内部。你如果学会使用这些控件,相信你就会会发现那看似复杂的一切居然如此简单!这些Internet类控件有三个。

  其中,Winsock控件主要是用来编制TCP/IP或UDP协议的通话应用程序。Internet Transfer控件主要用来传输文件,执行FTP命令及登录服务器等。WebBrowser则用于创建可加入自己的应用程序的浏览器。可能对于WebBrowser这个控件来说大家是比较熟悉的了,介绍饿文章比较多,它用来制作浏览器。下面我们介绍这前面两个控件的具体使用方法。

  一、用Internet Transfer编写文件传输程序

  文件传输实质就是让用户获得访问网络文件的服务即在远程主机和本地机器之间进行文件的拷贝,是目前一种应用较广的网络服务。

  文件传输一般也是基于Client/Server基础上的。文件传输的过程通常包括用户提出请求,建立连接,执行操作,断开连接和结束会话的过程。

  在这个程序中用到了两个Text控件。Text1控件用来输入FTP地址。Text2用来对目录列表或展示文件内容。其实现的源代码和详细注释如下: 
Option Explicit
Dim TempDir As String
Private Sub Form_Load()
’保存文件的临时目录
TempDir = "d:\ftptemp\"
End Sub

’当操作状态改变时的动作
Private Sub Inet1_StateChanged(ByVal State As Integer)
Dim vtData, txtData As String
txtData = ""
Select Case State
Case icError ’出错时
Debug.Print Inet1.ResponseCode & " " _
& Inet1.ResponseInfo
Case icResolvingHost, icRequesting, icRequestSent
’寻找,请求或送出请求时
StatusBar1.Panels(1).Text = "正在查找..."
Case icHostResolved
StatusBar1.Panels(1).Text = "找到"
Case icReceivingResponse, icResponseReceived
StatusBar1.Panels(1).Text = "接收数据"
Case icResponseCompleted
’接到回答后,保存数据
’接收第一块
vtData = Inet1.GetChunk(1024)
’getchunk获得发送过来的数据
txtData = txtData & vtData
Do While LenB(vtData) 〉 0
’得到下一大块。
vtData = Inet1.GetChunk(1024, icString)
txtData = txtData & vtData
Loop
Text2.Text = txtData
StatusBar1.Panels(1).Text = "完成"
Case icConnecting, icConnected
StatusBar1.Panels(1).Text = "正在连接"
Case icDisconnecting ’无法连接
Case icDisconnected
Case Else ’其他
Debug.Print States
End Select
End Sub

’输入地址,按ENTER键确认后
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
On Error GoTo ErrOpen ’转入错误处理
Inet1.URL = Text1.Text ’赋予地址
Inet1.Execute "DIR" ’执行DIR命令
Form1.Caption = Inet1.URL 
End If
Exit Sub
ErrOpen:
Select Case Err.Number
Case icBadUrl
MsgBox ("地址错误,请重输一遍!")
Case icConnectFailed, icConnectionAborted, 
icCannotConnect
MsgBox ("网络连接失败!")
Case icExecuting
Inet1.Cancel
If Inet1.StillExecuting Then
MsgBox ("不能取消当前操作!")
Else
Resume
End If
Case Else
Debug.Print Err.Number, Err.Description
End Select
End Sub

Private Sub Text2_DblClick()
Dim mDir As String
If Text2.SelLength Then
’如果是目录,则用DIR命令
If Right(Text2.SelText, 1) = "/" Then
Text1.Text = Text1.Text & "/" & _
Left(Text2.SelText, Text2.SelLength - 1)
On Error GoTo ErrBrowse
mDir = Right(Text1.Text, Len(Text1.Text) 
- Len(Inet1.URL))
Inet1.Execute , "DIR" & mDir & "/*"
’如果是文件,则获得文件内容
Else
mDir = Right(Text1.Text, Len(Text1.Text) 
- Len(Inet1.URL)) & "/" & Text2.SelText
Inet1.Execute , "GET" & mDir & _
" " & TempDir & Text2.SelText
End If
End If
Exit Sub
ErrBrowse:’错误处理
If Err.Number = icExecuting Then 
Inet1.Cancel
If Inet1.StillExecuting Then
MsgBox ("不能取消当前操作!")
Else
Resume
End If
Else
Debug.Print Err.Number, Err.Description
End If
End Sub

二、用Winsock编写通信程序

  通信程序看起来极为神秘,其实只要搞懂了Winsock的使用方法,编程就简单多了。下面让我们来看一个实例吧。

  人们编写通信程序通常都是采用Client/Server形式。这就要求作为服务器的主机可以同时处理多个客户的请求。因此在编写服务器程序时要添加多个Winsock控件。在开始我们先加入两个Winsock控件。其中一个用来侦听网上请求信号,取名为Listener;另外一个为初始的连接口,取名叫Sock(0)。注意,后一个控件要设为动态数组的形式,以后当客户增多时,可在这个控件基础上动态增加。由于受资源限制,我们在本例中设定最多可以同时接纳15个客户。客户机一般只与一个主机相连,因此程序只须一个Winsock进行连接就足够了。这个程序要用到的控件较少,除了Winsock和Form控件外,只须再添加Commmand控件即可。下面是具体程序和详细注释。 
’******************************
  服务器程序
’******************************
  Option Explicit
  ’定义常量
  Const BUSY As Boolean = False
  Const FREE As Boolean = True
  ’定义连接状态
  Dim ConnectState() As Boolean
  Private Sub Form_Load()
ReDim Preserve ConnectState(0 To 1)
On Error Resume Next
ConnectState(0) = FREE
ConnectState(1) = FREE
’指定网络端口号
Listener.LocalPort = 1011
‘开始侦听
Listener.Listen
End Sub
Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
Dim SockIndex As Integer
Dim SockNum As Integer
On Error Resume Next
Form1.Print requestID & "连接请求"
’查找连接的用户数
SockNum = UBound(ConnectState)
If SockNum 〉 14 Then
Form1.Print SockIndex & ""
Exit Sub
End If
’查找空闲的sock
SockIndex = FindFreeSocket()
’如果已有的sock都忙,而且sock数不超过15个,动态添加sock 
If SockIndex 〉 SockNum Then
Load Sock(SockIndex)
End If
ConnectState(SockIndex) = BUSY
Sock(SockIndex).Tag = SockIndex
’接受请求
Sock(SockIndex).Accept (requestID)
Form1.Print SockIndex & "接受请求"
End Sub

’客户断开,关闭相应的sock
Private Sub Sock_Close(Index As Integer)
If Sock(Index).State 〈〉 sckClosed Then
Sock(Index).Close
End If
ConnectState(Index) = FREE
Form1.Print Index & "close"
End Sub

’接收数据
Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim dx As Double
Form1.Print "数据来自" & Index
Sock(Index).GetData dx, vbDouble
Form1.Print "dx=" & dx
End Sub

’寻找空闲的sock
Public Function FindFreeSocket()
Dim SockCount, i As Integer
SockCount = UBound(ConnectState)
For i = 0 To SockCount
If ConnectState(i) = FREE Then
FindFreeSocket = i
Exit Function
End Ifs
Next i
ReDim Preserve ConnectState(0 To SockCount + 1)
FindFreeSocket = UBound(ConnectState)
End Function

’***************************
客户程序
’***************************
Option Explicit
’发送数据
Private Sub command1_Click()
Dim dx As Double
dx = 23.9
sock.SendData dx
MsgBox ("data sended")
End Sub

Private Sub Form_Load()
’远程主机名
sock.RemoteHost = "media2"
’网络端口
sock.RemotePort = 1011
’发出连接命令
sock.Connect
Command1.Enabled = False
End Sub

’服务器关闭
Private Sub sock_Close()
MsgBox ("socket closed")
End Sub

’连接成功
Private Sub sock_Connect()
MsgBox ("socket connected")
Command1.Enabled = True
End Sub
  • 上一篇文章: 没有了

  • 下一篇文章:
  • 相关文章