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

2022-10-27 10:36:33 浏览数 (4)

今天猫猫花了一下午弄清楚了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)))

运行效果如下

如需源码,请联系我。

0 人点赞