高手看看这段程序,为什么客户端ClientSocket发送数据后,就被断开(100分)

  • 主题发起人 主题发起人 zhousi
  • 开始时间 开始时间
Z

zhousi

Unregistered / Unconfirmed
GUEST, unregistred user!
由于种种原因,老板要求用sock实现http协议get的发送(保持连接的,普通的ie就是
非连接的,通俗点就是clientsocket要保持active=true),所以我就改写了杜长胜的
dcs-httpserver(网上有开放代码),自己写了客户端,但后来发现,每发送一次数据后
客户断就被断开了。下面是杜长胜的一段程序,大家帮帮我,看怎么改
procedure TServerThread.ClientExecute;
var
Stream : TWinSocketStream;
Buffer :PChar;
buffer1: array[0 .. 1023] of Char;
size,i,alllen: integer;
MyFStream:Tfilestream;
head:string;
tttype:accepttypekind;
temp:string;
cf1:pchar;
re:pchar;
sbuf:string;
relong:integer;
begin
head:=format('%s',['HTTP/1.0 200 OK'])+#13+#10;
head:=head+'Server: dcs-http-server/1.0'+#13+#10;
head:=head+'Date: Thu, 06 Dec 2001 15:08:55 GMT'+#13+#10;
try
while (not Terminated) and ClientSocket.Connected do
begin
Stream := TWinSocketStream.Create(ClientSocket, 30000);
FillChar(Buffer1, 1024, 0);
if Stream.WaitForData(20000) then
begin
if Stream.Read(Buffer1, 1024) = 0 then
ClientSocket.Close
else
begin
tttype:=accepttype(buffer1,requestfilename);
case tttype of
requesthead:
begin
ClientSocket.SendText(head+#13+#10);
ClientSocket.Close;
end;
requestget:
sendfile(stream);
end;{end case}
Stream.Free;
exit; //加了exit 也没有用
ClientSocket.Close;
end;
end
else
ClientSocket.Close;
end;
except
//HandleException;
end;
end;

这里他用了线程,不知道他怎么结束线程(我对线程不太熟悉)
 
线程运行完成后会自己关闭,因为线程结束了所以创建的socket也要释放,就断开了阿
 
to ggu
呵呵知道了,不过想想,还是比较难办,不能让这个线程结束,只可怎么办
有没有好的建议????
 
用循环,然后暂停(suspend),
谢谢 ggu
 
还是不行,555
 
这是SOCKET方面的设置问题。
阻塞式和非阻塞式两种方式,在阻塞方式下用TWinSocketStream,可是在数据传送结束后
就会自动断开。在非阻塞方式下没有必要使用线程,但能否实现类似HTTP GET的操作我
并不清楚。
 
就用TClientSocket和TServerSocket的非阻塞来发文件呀,我做过的,没有任何问题
 
学习啊~~~~~~~~~~~~~~~

 
程序分为server端和client端,server端用阻塞,即用多线程,可以同时为多个client服务
client端,我现在用的是非阻塞的方法,用ClientSocket连接代理服务器(只有http协议的)
然后向代理服务器发送向server端,get(或post)的请求,实现流或文本的通信(要保持连接的)!
但遇到了好多问题:
get或post后,发现客户端与代理服务器端的连接被断开,通过楼上各高手的分析,
认为是server端的线程结束,导致的,但我让线程暂停后,
server端就再也受不到信息了
 
用循环的writebuf和readbuf来接受和发送数据
 
server实现一对多可不一定非要用阻塞方式吧!
看来是你的server端的线程控制有问题。
可以用张无忌老兄的做法来实现呀,不用阻塞的方式,最多采用应答的方式就够啦!
 
多人接受答案了。
 
后退
顶部