原文链接: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. Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案

    此文章仅作为本人的笔记,文章转载自  http://blog.csdn.net/defonds/article/details/46042809 Nginx 做反向代理,后端是 tomcat,chro ...

  2. BCHABC/BCHSV的矛盾所在

    BCHABC: 将BCH以后发展智能合约: 消息方面: 吴忌寒:BCH分叉不可避免 未来可能继续分叉 近日,吴忌寒在北大光华管理学院的区块链培训课程上发表演讲表示,在这种言论自由地环境下,我认为分裂就 ...

  3. Soa思想分布式服务webservice WCF

    什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这 ...

  4. 【Android优化篇】提升Activity加载速度的方法

    文章转自:http://www.jianshu.com/p/2007ca0290d3 作者: CoderFan 前言 这个也是我面试遇到的问题,当时只回答了一种情况,异步加载数据,没想到别的方式,回来 ...

  5. PAT 1021 个位数统计 (15)(C++&Java&Python)

    1021 个位数统计 (15)(15 分) 给定一个k位整数N = d~k-1~*10^k-1^ + ... + d~1~*10^1^ + d~0~ (0<=d~i~<=9, i=0,.. ...

  6. Codeforces 757B. Bash's Big Day GCD

    B. Bash's Big Day time limit per test:2 seconds memory limit per test:512 megabytes input:standard i ...

  7. Linux中处理字符串

    获取字符串长度: ${#字符串变量名} 截取子串: 1. expr substr 字符串 起始位置 截取长度 2. 命令输出 | cut -c 起始位置-结束位置 命令输出 | cut -c &quo ...

  8. jquery单行文字上下循环滚动

    html代码: <div class="box"> <div class="t_news"> <b>已关联奖励账号.昵称:& ...

  9. visual studio 修改注释快捷键,和断点

    修改成alt+3和alt+4.效果不错 修改插入断点快捷键.这样按F12 就可以插入删除断点了.很爽 tab是批量加缩进 shift+tab 是批量减缩进

  10. STL基础3:map

    #include <iostream> #include <map> #include <string> using namespace std; #define ...