各位高手:
PB9.0下,制作的两个程序之间如何才能传输文本文件呢?
例如:客户端1给客户端2传输个文件,远程,通过socket怎么才能实现呢?求
高手给些源码。谢谢!
------解决方案--------------------
我建议你不要直接传输,而是blob存到服务器
由接受方接受后删除服务器存的。接受方做个timer设定间隔自动检索有没有需要接受的文件或者手动检查,类似outlook邮件
这样接受方如果当时不在也不会丢失
------解决方案--------------------
如果你一定要socket我没做过,好像和pb什么版本有关
你还可以搜一下powertcp看看源码
转帖一篇前人的:
PB中的套接字是通过Winsock.pbl库来提供的,它封装了套接字编程中用到的数据结构和过程,在功能上类似于VB中的Winsock控件。
Winsock.pbl中定义了两种类型的Socket:流式Socket和数据报式Socket。流式Socket需要连接到另一个处于监听状态的流式Socket后才能进行通信,是基于连接的,其可靠性高;数据报式Socket无需建立连接,源主机发出的报文在网络中经过存储转发后到达目的主机,效率高但可靠性低。编程时,根据应用环境和需求选择其中一种,若通信子网相当可靠,可考虑采用数据报式Socket。
用PB编写WinSock TCP/IP应用程序的第一步是将Winsock.pbl加到应用程序中,然后声明如下全局变量:
Winsock ws
Boolean b—tcp—active
//用于检验ws是否初始化成功
PowerObject gpo—null//全局空对象
在应用程序的Open事件加入下列代码:
ws=Create Winsock
//初始化Winsock的一个实例
SetNull(gpo—null)//ws的函数中用到空对象gpo—null
在应用程序的Close事件加入下列代码:
Destroy ws//销毁ws对象
完成以上工作后,就可以着手编程了,下面介绍如何利用Socket进行通信。
1.用数据报式Socket向本机的7号端口发送数据
TCP和UDP协议规定了传输层端口的长度为16比特,因此TCP和UDP软件可以使用216个不同的端口进行通信。尽管如此,编程时最好不要使用前1024个端口,因为这个范围内很多是专用端口,如21为FTP端口。本例中用到的7号端口很特殊,它回显接收到的任何数据,常用于端口检测。下面就向本机的7号端口发送数据报:
DGSock=Create Socketdgram
//创建数据报式Socket对象
ulAddr=ws.inet—addr(″127.0.0.1″)
//将本机IP地址转换为32位的ulong类型
buf=Blob(″These data is send through datagram~r ~n″)//要发送的数据
DGSock.sendto(buf,Len(buf),0,ulAddr,7)
//向ulAddr主机的7号端发送数据报
buf=Blob(Space(Len(buf)))
//清空buf缓冲区
DGSock.recv(buf,Len(buf),0)
//接收数据报
MessageBox(′Data Received′,String(buf))
//显示接收到的数据
DGSock.closesocket()//关闭Socket
Destroy DGSock
从上面的演示可以看出,发送到本机7号端口的数据报立即被反弹回来。
2.用流式Socket 开发网络聊天程序
网络聊天程序通常包含两个部分:服务程序和客户程序。服务程序一直处于监听状态,当听到客户程序的呼叫时,就创建一个Socket对它进行响应。下面用流式Socket开发一个两节点聊天程序:
(1)编写服务程序
服务程序界面如图1所示。在主窗口的Open事件中创建流式Socket的一个实例:
sSock=Create SockStream//sSock为实例变量
在“监听”按钮的Clicked事件中加入下列代码:
ulAddr=ws.inet—addr(″202.140.1.20″)
//将服务器地址转为ulong类型
sSock.bind(ulAddr,2000)//将流式Socket绑定到ulAddr地址的2000号端口上
sSock.listen(5)//监听上述地址和端口,参数为请求队列长度,最大值为5
uiSockType=sSock.accept(ulClientAddr,iClientPort)
//接受客户请求,参数填入了客户Socket的地址和端口,返回值为客户Socket类型
sAccept=Create Socket
//创建一个Socket响应客户请求
ulParam=1
sAccept.initsocket(uiSockType)
//与客户Socket类型相同
sAccept.ioctlsocket(ws.FIONBIO,ulParam)
//异步模式
Timer(0.5)
//启动定时器,以0.5秒的间隔接收数据
在Timer事件中加入下列代码来处理到达的数据:
buf=Blob(Space(256))//定义缓冲区大小
sAccept.recv(buf,Len(buf),0)
//接收到达的数据
mle—1.Text=mle—1.Text+Trim(String(buf))
//显示消息
在“发送”按钮的Clicked事件中加入下列代码:
buf=Blob(mle—2.Text+″~r~n″)
//将mle—2中的内容放入发送缓冲区
sAccept.send(buf,Len(buf),0)
//将buf中的内容发给对方
mle—2.Text=″ ″
//清除已发送的内容
在“退出”按钮的Clicked事件中加入下列代码: