原文链接:http://tech.163.com/06/0407/14/2E46BB930009159S.html

如同上面的内容所描述的,不论您使用UDP协议或是TCP协议,Winsock控件都可以允许与远程的设备连接,并且在相互之间交换数据。因此,依据上面的面熟而言,不论您使用的是哪一种协议都可以扮演主机端和客户端的角色。

同时,当您在使用Winsock控件的过程中,这个控件不会显示在正在执行的窗体之中。换句话说,Winsock控件是在后台运行的一种控件。在执行过程之中,不会具有任何选用、可见的控件。那么该如何使用Winsock控件呢?它可以被应用在那些类型的应用程序之中呢?以下所列出的内容,是这个控件可以应用的大致范围:

☺将客户端所收集的数据,传送给主机端。

☺点对点的文件传送。

☺聊天室应用程序。

☺电子公告栏。

☺voip(voice over TCP/ip)

因此,当您希望建立上述类型的应用程序之前,必须要学习如何选用适合的协议类型。

2-1如何选用适用的协议

当您准备开始使用Winsock控件之前,首要的工作是如何选择适用的协议类型。如同先前所述的,您可以选择TCP 协议或是UDP协议中的一种。但是这两种协议的差异点在哪里呢?虽然,它们同样可以使用在Internet或是Internet环境之中,但是主要的差异在于连接的状态。以下是这两种协议的特点说明:

☺TCP协议是属于面向连接的协议。所谓的面向连接协议是指——“在您可以交换数据之前,在两个终端设备之间必须连接成功”。同时,在网络的基础理论之中,都会特别强调TCP具有错误核对的功能。也就是说,在数据的传送过程中,如果发生错误或是数据无法传达对方时,TCP协议将会重复尝试着重新传送数据。因此,核对以及重新传送的能力,因此起传输效率会比Internet协议或是巨域网络协议差一些(netBIEUI、IPX、AppleTalk)。

☺UDP协议是属于无面向连接协议。这种协议为适用在两个设备之间,适用于信息传送以及数据的传输方面。但是在使用时,必须注意当你将信息送出时,对方可能已经离线,因而无法接收到数据,而您也无法实时察觉到对方已经离线。此外,使用UDP协议的最大数据传送量,完全取决于网络的传输量。因此,此种协议较为适用于局域网络。

因此,当您在建立应用程序并且选用适当的协议之前,务必先依据应用程序使用的环境来选择适用的协议。

2-2设置协议

当已经选择好适当的协议之后,接下来,将必须要设置协议的类型。在Visable Basic之中,共有两种设置协议的方式:“修改属性窗口”以及“程序代码设置”。以下是这两种设置方式的说明。 ☺修改属性窗口(见图2-1)

☺程序代码设置

Winsock1.Protocol=sckTCPProtocol

3.TCP连接的基础

在使用TCP协议来建立应用程序的过程中,首先必须决定应用程序是属于主机端

是客户端来决定应用程序所扮演的角色问题。因此,在建立应用程序的过程中,如果您选择“主机端”时,主机端的Winsock控件必须将特定的连接端口号设置在监听模式之中。同时,在客户端提出连接的请求时,主机端可以允许客户端的连接请求,并且完成连接的程序。

因此,一旦主机端与客户端连接成功之后,在这个部设备之间即可开始传送数据,以下的程序代码,具有TCP连接的基本聊天室功能。

3-1TCP连接范例

在此笔者只做简单的-程序介绍,

♣frmserver窗体的设计内容

如图3-1所示

♣frmserver的程序代码

 private sub form_load()

 ‘设置本机连接端口的localport属性的内容

 ‘请注意!必须是整体值

 tcpserver.LocalPort=

 ‘将本机连接端口设置为监听模式

 tcpserver.Listen

 Me.Caption=”frmsever”

 Label1.Caption=”传送的文字“

 Label2.Caption=”接收的文字“

 ‘打开frmclient窗体

 frmClient.Show

 end sub

 private sub tcpserver_connectionrequest(byval requestid as long)

 ‘如果tcpserver 控件的状态目前不是处于关

 ‘闭的状态时,在允许远程设备连接时,必须要关闭目前的控制的运行

 if tcpserver.state<>sckclosed then tcpserver..close

 ‘允许远程设备使用必要的识别码(requestid)与主机进行连接

 tcpserver.accept requestid

 end sub

 private sub txtsend_change()

 ‘当txtsend控件的内容发生变化时,将txtsend控件的内容,通过tcpserver控件senddata方

 ‘法,将txtsend控件的内容传送给frmclient

 tcpserver.senddata txtsend.text

 end sub 

 private sub tcpserver_dataarrival(byval bytestotal as long)

 ‘声明即将接收的数据类型

 dim strdata as string 

 ‘调用tcpserver控件的getdata方法,将接收的数据以vbstring数据类型,存放在strdata变量之中。

 Tcpserver.getdata strdata ,vbstring 

 ‘将strdata变量的内容,存放在txtoutput控件之中。

 Txtreceive.text =strdata

 End sud

frmclient窗体的设计内容

窗体的配置内容如图3-2

♣程序的代码

 private sub form_load()

 ‘指定远程主机的ip地址。如果是localhost,代表的ip地址为127.0.0.,并且也代表本机。

 Tcpclient.RemoteHost=”localhost”

 ‘设置本机连接端口的localport属性的内容

 ‘请注意!必须是整体值

 tcpclient.remoteport=

 ‘设置窗体的标题内容

 Me.Caption=”frmclient”

 Label1.caption=”传送的文字”

 Label2.caption=”接收的文字”

 Cmdconnect.caption=”与主机连接”

 End sub

 Private sub cmdconnect_click()

 ‘调用tcpclient控件的connect方法,来初始化与主机的连接请求

 tcpclient.connect

 end sub

 private sub txtsend_change()

 ‘当txtsend控件的内容发生变化时,立即调用tcpclient控件的senddata方法,将txtsend控件的内容传送给主机

 tcpclient.senddata txtsend.text

 end sub

 private sub tcpclient_dataarrival(byval bytestotal as long)

 ‘说明即将接收的数据类型

 dim strdata as string 

 ‘调用tcpclient控件的getdata方法,将接收的数据以vbstring数据类型存放strdata变量之中。

 Tcpclient.getdata strdata,vbstring

 ‘将strdata变量的内容,存放在txtoutput控件之中。

 Txtreceive.text=strdata

 End sub

♣程序的执行结果

3-1-1如何允许更多客户端同时连接

当您的应用程序架构是属于主从式架构时,一般来说,客户端应该不止一个而已。但是,如果每一个客户端使用的一组连接端口时,那么如果有100个客户端呢?如果有1000个客户端呢?那么究竟要增加多少个winsock控件呢?同时,也得要分成100(或是1000)组accept子程序,接着每一部客户端都必须记得固定的连接端口号。

其实,您大可不必如此辛苦。您可以利用Visable Basic控件数组的方式并利用监听用的数组元素(一般都是索引值“0”),来触发ConnectRequest事件。接下来再利用判别控件数组元素的连接状态来进行远程客户端连接。以下的程序代码范例,就是如何让许多远程用户连接到同一个连接端口号的程序代码的模板:

 private connmax as long 

 private sub form_load ()

 dim I as integer

 connmax =

 sckserver().localport=

 sckserver().listen 

 for I = to connmax

 load sckserver(i)

 next

 end sub

 private sub sckserver_connectionrequest(index as integer,byval requestid as long)

 dim I as intege

 for I = to connmax

 if sckserver().state=sckclosed then 

 sckserver(I).accept requestid

 end if 

 end if

 end sub

在上述的程序范例中,将会建立一个具有“201”个元素的sckserver控件数组。接着,利用for。。。next循环的方式,来设置加载sckserver控件数组元素或是判断数组元素是否正在连接中进而允许客户端连接。至于sckserver控件数组总元素为“201”的原因在于——“connmax设置为200再加上sckserver(0),因此总元素数量为201”。

4.UDP连接的基础

在 建立UDP的应用程序时,其过程会比TCP协议简单许多。这是由于UDP协议在数据传送之前,可以不需要特别明确的连接方式。但是,在上述的TCP连接方式之中,Winsocke控件必须设置在“监听(Linsten)”状态之下,同时在客户端准备与主机进行连接时,主机端也必须要使用Accept方法来允许客户端所要求的连接。

反观在UDP协议方面,双方仅仅需要使用Bind方法,即可与对方连接并且传输数九,因此,UDP协议连接过程的处理方式确实比TCP简单许多。下面介绍使用UDP协议来传送信息的过程。

4-1UDP的连接范例

在此只做简单的介绍

♣窗体frm PeerA的设计内容

如图4-1所示

♣窗体的程序代码

 Private Sub Form_Load()

 ′控件的名字为udpPeerA

 With udpPeerA′重点:必须将 RemoteHost 的值修改为对方计算机的名字。

 RemoteHost= ″PeerB″

 RemotePort =  ′连接的端口号。

 Bind  ′绑定到本地的端口。

 End With

 frmPeerB.Show′显示第二个窗体。

 End Sub

 Private Sub txtSend_Change()

 ′在键入文本时,立即将其发送出去。

 udpPeerA.SendData txtSend.Text

 End Sub

 Private Sub udpPeerA_DataArrival (ByVal bytesTotal As Long)

 Dim strData As String

 udpPeerA.GetData strData

 txtOutput.Text = strData

 End Sub

♣窗体frmpeerB的设计内容

如图4-2所示

♣窗体frmpeerB的程序代码

 Private Sub Form_Load()

 ′控件的名字为 udpPeerB。

 With udpPeerB

 ′重点:必须将RemoteHost的值改为对方计算机的名字。

 RemoteHost= ″PeerA″

 RemotePort =  ′要连接的端口。

 Bind  ′绑定到本地的端口上。

 End With

 End Sub

 Private Sub txtSend_Change()

 ′在键入后立即发送文本。

 udpPeerB.SendData txtSend.Text

 End Sub

 Private Sub udpPeerB_DataArrival (ByVal bytesTotal As Long)

 Dim strData As String

 udpPeerB.GetData strData

 txtOutput.Text = strData

 End Sub

VB网络编程中Winsock的使用的更多相关文章

  1. VC++学习之网络编程中的套接字

    VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...

  2. [转帖]关于网络编程中MTU、TCP、UDP优化配置的一些总结

    关于网络编程中MTU.TCP.UDP优化配置的一些总结 https://www.cnblogs.com/maowang1991/archive/2013/04/15/3022955.html 感谢原作 ...

  3. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  4. socket网络编程中read与recv区别

    socket网络编程中read与recv区别 1.read 与 recv 区别 read 原则: 数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待.所以一般情况下:我们读取数据都需要采用 ...

  5. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  6. 网络编程中select模型和poll模型学习(linux)

    一.概述 并发的网络编程中不管是阻塞式IO还是非阻塞式IO,都不能很好的解决同时处理多个socket的问题.操作系统提供了复用IO模型:select和poll,帮助我们解决了这个问题.这两个函数都能够 ...

  7. Java网络编程中异步编程的理解

    目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...

  8. 网络编程中的read,write函数

    关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Steve ...

  9. Unix网络编程中的五种I/O模型_转

    转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...

随机推荐

  1. Python数据分析--Pandas知识点(一)

    本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘 1. 重复值的处理 利用drop_duplicates()函数删除数据表中重复多余的记录, 比如删除重复多余的ID. im ...

  2. sql按照中文拼音排序

    select * from table order by convert(columnName using gbk) asc 注意:会导致全表扫描 建立冗余字段,插入数据时字段为convert(col ...

  3. 使用gearman进行异步的邮件或短信发送

    一.准备工作 1.为了防止,处理业务途中出现的宕机,请配置好gearman的持久化方式.2.使用gearmanManager来管理我们的worker脚本,方便测试. 上述两条请看我之前写的两篇文章 二 ...

  4. SQL Server 2008中的CTE递归查询得到一棵树

    ROW_NUMBER() OVER()函数用法 with CTE as     (      -->Begin 一个定位点成员       select ID, Name,Parent,cast ...

  5. python 基本数据类型 之 字符串

    字符串数据出现的意义 掌握字符串的定义和特性 能熟练掌握字符串常用操作,并了解其他工厂方法 字符串的定义和创建 字符串是一个有序的字符集合,用于存储和表示基本的文本信息,  用引号“          ...

  6. (转)DataRow的各种状态和DataView的两种过滤属性

    DataRow的各种状态 http://www.cnblogs.com/zxjyuan/archive/2008/08/20/1271987.html 一个DataRow对象刚被创建之后(DataTa ...

  7. JVM 运行时数据区 (三)

    JVM运行时数据区 运行时数据区由 程序计数器.java虚拟机栈.本地方法栈.堆.方法区 组成: 1.程序计数器 每一个Java线程都有一个程序计数器,用于保存程序执行到当前方法的哪一个指令,它是线程 ...

  8. Java.FamousBlogs

    本文总结在工作/学习中发现的Java相关的blogs. 1. java code geeks (jcg) http://www.javacodegeeks.com/join-us/jcg/ 2. ht ...

  9. BZOJ1047或洛谷2216 [HAOI2007]理想的正方形

    BZOJ原题链接 洛谷原题链接 显然可以用数据结构或\(ST\)表或单调队列来维护最值. 这里采用单调队列来维护. 先用单调队列维护每一行的最大值和最小值,区间长为正方形长度. 再用单调队列维护之前维 ...

  10. Android中关于使用空格对齐文字

    前言:今日编写新项目UI时,突然遇到文本有长有短无法对齐的问题(汗,以前竟从未遇到也从未考虑过这小小的问题),在资源文件中尝试Tab键.space空格键,发现效果都不能很好的实现,无奈只得请求度娘的协 ...