用VB Winsock控件创建TCP/IP客户机/服务器程序

2024-04-08 13:18

本文主要是介绍用VB Winsock控件创建TCP/IP客户机/服务器程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://www.52arm.com/Article_Show.asp?ArticleID=186

 

作者:weidian    ---本站原创    点击数:4721    发表时间:2008-5-7    编辑:sanzang

 

Winsock控件建立在TCP、UDP协议的基础上,完成与远程计算机的通信。即使对TCP/IP不太熟悉的用户,使用该控件也可以在十几分钟内创建一个简单的客户机/服务器程序。下面我们对Winsock控件的事件、方法、属性按其在程序中出现的顺序分别作详细的介绍,以便更好地理解程序源代码。

下面是Winsock控件的相关属性,方法和事件。(略去一些暂用不到的)

*属性
-------------------------------------------------------------------------
LocalHostName | 本地机器名
LocalIP | 本地机器IP地址
LocalPort | 本地机器通信程序的端口(0<端口<65536)
RemoteHost | 远程机器名
RemotePort | 远程机器的通信程序端口
state | 连接的当前状态(文后有详细说明)
Protocal | 使用TCP或UDP协议(这里我们选‘0-sckTCPProtocal’)
--------------------------------------------------------------------------
*方法
--------------------------------------------------------------------------
Listen
Listen方法用于服务器程序,等待客户访问。
格式:Winsock对象.listen
Connect
Connect方法用于向远程主机发出连接请求
格式:Winsock对象.connect [远程主机IP,远程端口]
Accept
Accept方法用于接受一个连接请求
格式:Winsock对象.accept Request ID
Senddata
此方法用于发送数据
格式:Winsock对象.senddata 数据
Getdata
用来取得接收到的数据
格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]]
Close
关闭当前连接
格式:Winsock对象.close
*事件
----------------------------------------------------------------------------
Close | 远程机器关闭连接时触发
Connect | 连接建立好,可以进行通信时触发(客户端)
ConnectRequest | 有请求连接到达时产生(服务器端)
DataArrival | 有数据到达时触发
Error | 发生错误时发生
SendProgress | 数据传送进度
-----------------------------------------------------------------------------

  服务器程序的实现过程是:
  (1)服务器程序必须设置好LocalPort属性,作为侦听端口,该值为一个整数(只要是一个其它TCP/IP应用程序没有使用过的值即可)。
  (2)使用Listen方法进入侦听状态,等待客户机程序的连接请求。
  (3)客户机程序发出连接请求,使服务器程序产生ConnectionRequest事件,该事件得到一个参数requestID。
  (4)服务器程序用Accept方法接受客户机程序的requestID请求。这样,服务器程序就可以用SendData方法发送数据了。Accept方法必须用上一步得到的requestID作为其参数。
  (5)当服务器程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。
  (6)如果接受到Close事件,则用Close方法关闭TCP/IP连接。
  客户机程序的实现过程是:
  (1) 客户程序设置Remotehost属性,以便指定运行服务器程序的主机 名,该字符串可在“控制面板|网络|标识|计算机名”中查到。
  (2) 设置RemotePort属性,以便指定服务器程序的侦听端口。
  (3)使用Connect方法,向服务器提出连接请求。
  (4)服务器接受客户机程序的请求,客户机程序产生Connect事件,就可以用SendData方法发送数据了。
  (5)当客户机程序接收到数据时,产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。
  (6)如果接受到Close事件,则用Close方法关闭连接。
  Winsock控件还有两个重要的属性,即Protocol和State。Protocol设定使用的协议是TCP还是UDP:取值sckTCPProtocol表示TCP, 取值sckUDPProtocol则表示UDP。因为Winsock控件的缺省设置是sckTCPProtocol,所以程序中并没有使用Protocol属性。State属性反映的是当前TCP/IP的连接状态,取值如表1所示。
  表1 Winsock控件的State属性及其描述

常数
描述
SckClosed
0
缺省值,关闭
SckOpen
1
打开
SckListening
2
侦听
SckConnectionPending
3
连接挂起
SckResolvingHost
4
识别主机
SckHostResolved
5
已识别主机
SckConnecting
6
正在连接
SckConnected
7
已连接
SckClosing
8
同级人员正在关闭连接
SckError
9
错误
  先在一台计算机上运行服务器程序,此时窗口上只有一个“退出”按钮。 再在另一台计算机上运行客户机程序,在“连接”按钮右边的文本框中输入服务器的主机名后单击“连接”按钮。如果连接成功,则服务器和客户机程序窗口都会出现两个文本框。这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下面的文本框中出现。
  服务器程序使用的控件如下:
  (1)Command1:退出按钮;
  (2)textsend:发送数据文本框;
  (3)Winsockserver: 服务器Winsock;
  (4)textget :接收数据文本框。
  服务器程序的界面如图所示。
  服务器程序的源代码如下:
  Private Sub Command1_Click()
  End
  End Sub
  Private Sub Form_Load()
   textsend.Visible = False
   textget.Visible = False
   Winsockserver.LocalPort = 1001
   Winsockserver.Listen
  End Sub

  Private Sub textsend_Change()
  Winsockserver.SendData textsend.Text
  End Sub
  Private Sub Winsockserver_Close()
  Winsockserver.Close
  End
  End Sub
  
  Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)
  textsend.Visible = True
  textget.Visible = True
  If Winsockserver.State <> sckClosed Then Winsockserver.Close
  Winsockserver.Accept requestID
  End Sub
  
  Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)
  Dim tmpstr As String

  Winsockserver.GetData tmpstr
  textget.Text = tmpstr
  End Sub

  客户机程序使用的控件如下:
  (1)Command1:退出按钮;
  (2)Command2:连接按钮;
  (3)Winsockclient:客户Winsock;
  (4)Text1:主机名文本框;
  (5)Textsend:发送数据文本框;
  (6)Textget:接收数据文本框;   
  客户机程序的源代码如下:
  Private Sub Command1_Click()
  End
  End Sub
  Private Sub Command2_Click()
  Winsockclient.Connect
  End Sub
  Private Sub Form_Load()
  textsend.Visible = False
  textget.Visible = False
   Winsockclient.RemotePort = 1001
  Winsockclient.RemoteHost = "sccdsz"
  End Sub
  Private Sub Text1_Change()
  Winsockclient.RemoteHost = Text1.Text
  End Sub
  Private Sub textsend_Change()
  Winsockclient.SendData textsend.Text
  End Sub
  Private Sub Winsockclient_Close()
   Winsockclient.Close
   End
  End Sub
  Private Sub winsockclient_Connect()
   textsend.Visible = True
   textget.Visible = True
   Command2.Visible = False
  End Sub
  Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)
  Dim tmpstr As String
  Winsockclient.GetData tmpstr
  textget.Text = tmpstr
  End Sub

这篇关于用VB Winsock控件创建TCP/IP客户机/服务器程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885691

相关文章

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A