今天猫猫花了一下午弄清楚了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)))
运行效果如下
如需源码,请联系我。