前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VFP通过winsock控件实现客户端和服务器多对一通信

VFP通过winsock控件实现客户端和服务器多对一通信

作者头像
加菲猫的VFP
发布2022-10-27 10:36:33
1.4K0
发布2022-10-27 10:36:33
举报
文章被收录于专栏:加菲猫的VFP

今天猫猫花了一下午弄清楚了Winsock的控件的用法,现在已经实现了多对一通信,但VFP是单线程的,能承载多少客户端,还有待测试。

猫猫封装了一个Qiyu_winsock控件类,服务端使用的,平常就放在项目中就好。

服务端的原理就是一个连接进来了,就newobject Qiyu_winsock来接收处理数据。

话不多说,代码如下

一. 服务端开发

表单添加一个EDIT1的文本框,一个winsock的控件叫tcpserver,添加一个collwinsock的属性,分别添加dataevets,getwinsock的方法

如图所示

表单的init事件

设置了监听本地端口为1001

代码语言:javascript
复制
Thisform.tcpServer.LocalPort = 
Thisform.tcpServer.Listen
Thisform.collwinsock=Createobject("collection")

表单的getwinsock方法

作用是获取可以用的sock控件,并传入表单处理数据的方法名称

代码语言:javascript
复制
*-- state属性
*!*    sckClosed  缺省的。关闭
*!*    sckOpen  打开
*!*    sckListening  侦听
*!*    sckConnectionPending   连接挂起
*!*    sckResolvingHost   识别主机
*!*    sckHostResolved   已识别主机
*!*    sckConnecting   正在连接
*!*    sckConnected   已连接
*!*    sckClosing   同级人员正在关闭连接
*!*    sckError   错误
Local oObjsock,oObjsock1
*--不限制连接控件数量
oObjsock=.Null.
For i= To Thisform.collwinsock.Count
    lcname="tcp"+Transform(i)
    oObjsock1=Evaluate("thisform."+lcname)
    If oObjsock1.State =  && 找到可用链接
        oObjsock=oObjsock1
    Else
        If oObjsock1.State=  &&关闭掉连接
            oObjsock1.Close()
        Endif
    Endif
Endfor

*--新增
If Isnull(oObjsock)
    lnindex=Thisform.collwinsock.Count +
    lcname="tcp"+Transform(lnindex)
    *--表单添加组件,接收数据的方法名
    Thisform.Newobject(lcname,"qiyu_winsock","qiyu_winsock.vcx","","thisform.dataevents")
    oObjsock=Evaluate("thisform."+lcname)
    Thisform.collwinsock.Add(lcname)
Endif

Return oObjsock

TCPSERVER控件的connectionRequts事件

作用接收传入的数据链接

代码语言:javascript
复制
Lparameters requestid
*--找出连接池可空闲的winsock控件
LOCAL oWinSock
oWinSock=Thisform.getwinsock()
Thisform.edit1.Value = Thisform.edit1.Value +  "连接"+oWinSock.Name+Chr(10)+Chr(13)
oWinSock.Accept(requestId)

表单的dataevents事件

用来处理接收到的数据

代码语言:javascript
复制
Lparameters strData,oObject
Thisform.edit1.Value = Thisform.edit1.Value + strdata+CHR()
oObject.SendData("我回复"+strData)

这个可以自己选用接收的方法,在上面 Thisform.Newobject(lcname,"qiyu_winsock","qiyu_winsock.vcx","","thisform.dataevents") 来传入的。

客户端代码

拖入一个winsock控件,name=tcpclient,放入一个编辑框,一个文本框,name=edit1,添加connstate的属性

表单的init事件

代码语言:javascript
复制
Thisform.tcpClient.RemoteHost="127.0.0.1"
Thisform.tcpClient.RemotePort="1001"
Thisform.tcpClient.Object.Connect()

Tcpclient的connect事件

Tcpclient的DataArrival

代码语言:javascript
复制
Lparameters bytestotal

Comarray(This.Object,11)
Dimension lcBuffer[1] As Byte
This.Object.GetData(@lcBuffer,,bytesTotal)
Thisform.edit1.Value = Thisform.edit1.Value + lcBuffer

command1.click方法

代码语言:javascript
复制
If !Thisform.connstate
    Messagebox("连接失败")
    Return
Endif
Thisform.tcpClient.Object.SendData(Createbinary(Transform(Thisform.text1.Value)))

运行效果如下

如需源码,请联系我。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 加菲猫的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 服务端开发
    • 表单的init事件
      • 表单的getwinsock方法
        • TCPSERVER控件的connectionRequts事件
          • 表单的dataevents事件
          • 客户端代码
            • 表单的init事件
              • Tcpclient的connect事件
                • Tcpclient的DataArrival
                  • command1.click方法
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档