Socket BlockMode -- CJ(300分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
学到用时方恨少

写 Socket 写程序,一向用 NonBlockMode,这次需要把一个程序改为 BlockMode
没什么概念,有一个例子,看明白了,但对整个BlockMode还是没有什么概念,看
Delphi的帮助实在是@$@#!$。所以,哪位能帮忙把整个BlockMode的大概念解释一下
还有注意事项之类。

我拿到的例子如下:

{ TFileServerThread }

TFileServerThread = Class(TServerClientThread)
public
Procedure ClientExecute; override;
//有其它什么游泳的方法吗?
End;

{ TFileServerThread }

Procedure TFileServerThread.ClientExecute;
Var
Data: Array[0..1023] Of char;
RecText: String;
SocketStream: TWinSocketStream;
Begin
While Not Terminated And ClientSocket.Connected Do
Try
//超过30000指定时间读不到数据就退出?
SocketStream := TWinSocketStream.Create(ClientSocket, 30000);
Try
FillChar(Data, SizeOf(Data), 0);
//每次读取指定长度的数据,如果只有一半数据呢?继续等待?
If SocketStream.Read(Data, SizeOf(Data)) = 0 Then
Begin
// If we didn't get any data after xx seconds then close the connection
ClientSocket.SendText('Timeout on Server'+#13#10);
//Wait a little time to allow sending of text before disconnect
sleep(1);
ClientSocket.Close;
Terminate;
End;
RecText := Data;
If Length(RecText) > 2 Then
Delete(RecText, Pos(#13#10, RecText), 2); // Delete #13#10
If ClientSocket.Connected Then
Begin
ClientSocket.SendText(RecText);
SendMessage(Form1.Listbox1.Handle, LB_ADDSTRING, 0, Integer(PChar(RecText)));
PostMessage(Form1.Handle, CM_INCCOUNT, 0, 0);
End;
Finally
SocketStream.Free;
End;
Except
HandleException;
End;
End;


Procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
Var SocketThread: TServerClientThread);
Begin
// Create a new thread for connection
SocketThread := TFileServerThread.Create(False, ClientSocket);
ClientSocket.SendText('Welcome to Server'+#13#10);
End;


 
TServerClientThread是TServerWinSocket用的(Server),如果你想看,去看/Delphi5/source/VCL/scktsrvr.dpr
那个继承TServerClientThread写的经典。
 
如果时间紧不如用indy控件,都是Blocking的。
 
xixi :)
BlockMode 也称阻塞方式, 大概就是在该线程中数据不发送完,
下一步过程无法进行。

 
Indy的确很好用啊。你到它的网站上去,有一些文章是解释Blocking的。
 
我想用TSOCKET,而且,关键不在BLOCKING,而在THREADING,呵呵,我要多线程
不过总的概念没有,谁帮忙?
 
cj兄,mode很关键的哦,你用TSOCKTET,到了最后你还是要封装的:)TServerSocket封装得很好
除了功能稍微差了一点,不过还凑合用,对了你不是要邮件服务器吗,可以和我联系。
jams_classmate@263.net

100% Delphi Source SMTP, POP3, Web, 有实践会吧IMAP也加上
 
cj,看到了吗?
 
jamstina,我要一份行不行?
要分数请开口
 
to jamstina, a copy of mail-server please... w/ score reward :)
 
jamstina, : 我给你去MAIL了
 
hehe,同志们,很不好意思,我倒是发现TServerSoket之类的类有一个很大的Bug,正在证实中.
to cj:为什么要用block方式,这是Windows不建议的,要hook消息.
 
sonie:我用多线程,而且觉得这样传比较有正常,呵呵。
现在我看来要用indy了
 
hehe,莫名的就赚了300分。

不过现在我倒是在自己的应用中写了一个协议。
用了多线程的block方式,工作也还算正常。

好久以前的事了

不知CJ现在在作什么,我还答应了他东西一直没兑现。不好意思
 
后退
顶部