今天猫猫花了一下午弄清楚了Winsock的控件的用法,现在已经实现了多对一通信,但VFP是单线程的,能承载多少客户端,还有待测试。
猫猫封装了一个Qiyu_winsock控件类,服务端使用的,平常就放在项目中就好。
服务端的原理就是一个连接进来了,就newobject Qiyu_winsock来接收处理数据。
话不多说,代码如下
表单添加一个EDIT1的文本框,一个winsock的控件叫tcpserver,添加一个collwinsock的属性,分别添加dataevets,getwinsock的方法
如图所示
设置了监听本地端口为1001
Thisform.tcpServer.LocalPort =
Thisform.tcpServer.Listen
Thisform.collwinsock=Createobject("collection")
作用是获取可以用的sock控件,并传入表单处理数据的方法名称
*-- 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
作用接收传入的数据链接
Lparameters requestid
*--找出连接池可空闲的winsock控件
LOCAL oWinSock
oWinSock=Thisform.getwinsock()
Thisform.edit1.Value = Thisform.edit1.Value + "连接"+oWinSock.Name+Chr(10)+Chr(13)
oWinSock.Accept(requestId)
用来处理接收到的数据
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的属性
Thisform.tcpClient.RemoteHost="127.0.0.1"
Thisform.tcpClient.RemotePort="1001"
Thisform.tcpClient.Object.Connect()
Lparameters bytestotal
Comarray(This.Object,11)
Dimension lcBuffer[1] As Byte
This.Object.GetData(@lcBuffer,,bytesTotal)
Thisform.edit1.Value = Thisform.edit1.Value + lcBuffer
If !Thisform.connstate
Messagebox("连接失败")
Return
Endif
Thisform.tcpClient.Object.SendData(Createbinary(Transform(Thisform.text1.Value)))
运行效果如下
如需源码,请联系我。