高手看看偶的代码,TCPSERVER中为什么只能Writeln一次呐?

pigking4016 2005-05-16 02:34:47
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
Var
i:integer;
ret_k:array[0..30] of string;
read_str:string;
ygh,yhzh:string; //ygh为员工号 ,yhzh为用户帐号
timestr:string;
dhhm:string; //dhhm为用户号码
zxjg:string; //标识位
xls:string;
sendstr:string;
LABEL 10;
begin
with AThread.Connection do
begin
10: flag:='';
read_str:=Readln();
logging(file_log,'读取到'+read_str);
for i:=0 to 30 do
ret_k[i]:='';
str_dis(read_str,ret_k,'|||');
db97.StartTransaction;
flag:=ret_k[0]; //标识位
if flag='authen' then
begin
sendstr:='authen|||客户端认证|||31|||000=1|||003=0|||004=认证通过|||';
WriteLn(sendstr);
logging(file_log,'send authen');
goto 10;
end
else if flag='health' then
begin
ygh:=trimright(copy(ret_k[4],5,10)); //员工号为字段中第5位
yhzh:=copy(ret_k[6],5,5); //帐号为字段中第3位
xls:=find_xls(yhzh,db97); //由帐号查流水号
timestr:=datetostr(date)+' '+TimeToStr(time);
sendstr:='health|||用户健康档案归档|||23|||103=0|||104=归档成功|||';
//已经处理或异常的情况:包括已竣工重新发过来的和其他异常情况
if xls='-1' then
begin
zxjg:='e';
nothing_cl(timestr,' ',yhzh,timestr,ygh,zxjg,db97); //异常情况
end
else
begin
dhhm:=dhhm_sql(xls,db97); //读DHHM用户电话号码的值(可能为-1,暂不处理)
//如果完成
if process_ret(xls,ygh,db97)=0 then
begin
zxjg:='1'; //zxjg为1表示开通成功
health_cl(xls,dhhm,yhzh,timestr,ygh,zxjg,db97);
db97.commit;
logging(file_log,'successful');
end
//不完成
else
begin
zxjg:='-1'; //zxjg为-1表示开通失败
health_cl(xls,dhhm,yhzh,timestr,ygh,zxjg,db97);
db97.Rollback;
logging(file_log,'unsuccessful');
end;
end;
WriteLn(sendstr);
logging(file_log,'send health');
end;
disconnect;
end;
end;

这只是一个用于测试的代码!!只有第一次会给客户端回消息!以后就不可以的了!伤心!!偶刚刚接触INDY,高手多多指教哦!
...全文
150 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjsheng 2005-08-28
  • 打赏
  • 举报
回复
以前好像也遇到这种情况
不过用的是TCPSERVER TCPCLIENT
每次发送、接收后如果执行断开、重新连接就可以解决
土办法。。。 朋友可以试试
hzwmjl 2005-08-26
  • 打赏
  • 举报
回复
欢迎加入Borland DELPHI女程序员,参与群里技术讨论!欢迎女孩子,也欢迎男孩子参与技术讨论!群号15154361
syfly739 2005-08-26
  • 打赏
  • 举报
回复
关注,学习ing...
pigking4016 2005-05-16
  • 打赏
  • 举报
回复
是的!~偶也觉得一定是代码的问题!~但是问题出在哪儿呢?
我做的是一个短连接,第一个连接接受两个包,第一个用来确认是否联接,客户端收到我的确认消息后会紧接着发实际要处理的包,我会再回一个确认包的!

但是只有第一个包会返回确认消息,也就是Writeln,下面客户端的消息我可以受到,但是程序不做Writeln就disconnnect了!当然,从第2个连接开始我只会收到一个包!~

暴郁闷!~是缓冲区的问题?还是………………
看该贴第三楼的代码,str_dis只是一个处理函数,没影响的!~短短几行,没理由跳出Writeln语句的啊!
pigking4016 2005-05-16
  • 打赏
  • 举报
回复
楼上的,偶不知道如何跟踪内部代码!~~
ly_liuyang 2005-05-16
  • 打赏
  • 举报
回复
跟踪Indy内部代码吧
Indy是有点小问题,但还不至于WriteLN只能用一次的
一定是你的Code有问题的

http://lysoft.7u7.net
pigking4016 2005-05-16
  • 打赏
  • 举报
回复
readtimeout哪设置哪?

可是为什么第一次却可以发出去呐?客户端的确收到了呐?
freshui 2005-05-16
  • 打赏
  • 举报
回复
writeln应该不会有问题,问题可能处在readln上,block了吧
你把那个readtimeout设成2000或者别的试试是不是
pigking4016 2005-05-16
  • 打赏
  • 举报
回复
检查过了,中间没有问题的!
read_str:=Readln();
logging(file_log,'读取到'+read_str);
for i:=0 to 30 do
ret_k[i]:='';
str_dis(read_str,ret_k,'|||');
db97.StartTransaction;
flag:=ret_k[0]; //标识位
if flag='authen' then
begin
sendstr:='authen|||客户端认证|||31|||000=1|||003=0|||004=认证通过|||';
WriteLn(sendstr);
goto 10;
logging(file_log,'send authen');
比如这段代码,日志里显示已经收到read_str,但是sendstr的确没有发出去!偶觉得好没有理由的!
测试过几次,只有程序启动后第一次Writeln才会起作用!
hongqi162 2005-05-16
  • 打赏
  • 举报
回复
with AThread.Connection do
begin
......
writeln('aaa');
writeln('bbb');
end;
这样使不会有问题的,仔细检查一下是不是你中间处理的过程除了问题,还是连接已经断开了...

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧