问题很急啊,用阻塞方式的问题(100分)

H

hj5000

Unregistered / Unconfirmed
GUEST, unregistred user!
1:ReceiveText,Receivebuf都不能用了吗,那用什么
2:是否必需要自己写线程
3:如果文件是在客户端分成好几块传来的,我是在什么地方写接收的程序呢?在onread还是
其他的,最好那位大哥有原码给我参考一下。
 
???????????????????????????
 
关注
建议自己用 api
 
你用的是TClientSocket与TServerSocket吧?
用阻塞方式的话,自然首选多线程,因为这是一种同步方式程序会一直等待直到接收到数据
或超时。
如果文件时被分成几块来传输的那我觉得就需要自己设定一个简单的通讯协议来完成了,这
并不是很复杂。至于说在阻塞方式下就不需要定义OnRead方法了,只需在线程的Execute方法
中建立循环来不断检查接收到的数据。

也许下面代码示例对你有所帮助:

wssRecvStream : TWinSocketStream;
clientSocket1 : TClientSocket;

wssRecvStream := TWinSocketStream.Create(clientSocket1.Socket,receiveTimeOut);

procedure TMyThread.Execute
var
Buffer : Array[0..2047] of Char;
recvNum : Integer;
begin
while true do
if clientSocket1.Socket.Connected and wssRecvStream.WaitForData(receiveTimeOut) then
begin
FillChar(Buffer,SizeOf(Buffer),0);
recvNum := wssRecvStream.Read(Buffer, SizeOf(Buffer));
recevedBytes := recvNum;
end;
end;
end;
 
to awl
能详细点吗?我不是很清楚怎么使用这线程,比如什么时候调用等等。谢谢!
 
我觉得你的问题不太详细,具体要求也不明确,我只你能大概的说了。
什么时候使用这个线程就跟你的通讯协议有关了。假如你设计的是c/s模式的,那么在
服务器端中可以建立serversocket(可用非阻塞模式)进行监听,当有客户端连接时创建
新的线程用于与客户端连接。我觉得你是数据的分段传输,这就比较麻烦一些了,因为
传输的过程中除了有数据信息外,还包括相应的控制信息,这就需要解决怎么区分的问
题了,不过这也不难。当然你也可以参照ftp协议建立控制通道与数据通道来分别传输
控制信息与数据信息。我希望这样的回答对你有点用处
 
to awl
谢谢你的解答,我现在的想法是这样的
用socket来做传输文件的程序,服务器要能接收多个客户端的请求,并且能支持断点续传
因为考虑到会有很多用户,所以采用阻塞的方法。
正如你所说的,传输的过程中除了有数据信息外,还包括相应的控制信息,我已定义好了
信息格式,但因为ReceiveText,Receivebuf都不能用,我无法判断接收的到底是数据还是信息。
问题主要还是出在控制信息和数据信息的交互上了,比如我收到客户端的上传请求,在控制
信息中我知道了文件名,大小,路径,我开好文件,准备写。这时候数据来了,触发了事件,
我怎么能让它往我开好的文件理写呢?
万望解答。
 
其实我觉得你是想实现部分的FTP功能,FTP协议是把控制信息与数据信息分开传输的(使
用两个套接字)称为控制通道与数据通道,这样就可以解决你所说的问题了。不过也可以
参照HTTP协议,这样会简化许多。因为我想你是一次传输一个完整的文件(当然你想实现
断点续传),我简单的说一下我的想法:
双方建立连接以后,
客户端发传输命令:
如:
put: abc.exe #13#10
size: xxxxx #13#10
date: xxxxx #13#10
....
服务器端收到後,在保存路径中检查文件是否存在?如果存在则检查是否完成(续传)?
以要续传为例,发如下命令:
ok #13#10
begin: Bytes xxxx #13#10
......
客户端接收到以后就可以从Bytes xxxx所指定的地方读取文件,发送给Server。
server端着时候打开文件跳传到相应位置进行写操作。
 
接受答案了.
 
顶部