起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 298|回复: 13

[结贴]有人用过Business.System.TClientSocket么?(急)**

[复制链接]
发表于 2008-5-12 16:24:44 | 显示全部楼层 |阅读模式
有人用过Business.System.TClientSocket么?
  procedure TDemoClient.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  MsgRecv,msgCmd,msgContent,msgSendData:string;
  iLength:Integer;
begin
MsgRecv:=Socket.ReceiveText;
  Memo2.Lines.Add(MsgRecv);
……
end;
服务端:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
if msgCmd=MP_CONN then
    begin
        memo2.Lines.Add ('同意连接!');
      Socket.SendText(MP_ACCEPT);//客户端无反映
    end
现在问题是Server发数据,Socket.SendText(MP_ACCEPT);而客户端无反应,
不进入  procedure TDemoClient.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
另外Client,Server我都是使用noBlocking模式。
回复

使用道具 举报

发表于 2008-5-13 09:03:25 | 显示全部楼层
楼主您好,我们之前也没有这样调用过Socket
使用Blocking模式时是好用吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-13 10:04:27 | 显示全部楼层

你们这个TClientSocket和Delphi TClientSocket?

你们这个TClientSocket和Delphi TClientSocket?是一样的么?
代码在Delphi中使用NoBlocking。是Client<-->Server是可正常通信的。
刚试了一下使用Blocking,结果连Delphi的Server端都不能收到Client发的消息了??
回复 支持 反对

使用道具 举报

发表于 2008-5-13 10:11:24 | 显示全部楼层
你用的是Delphi几的版本.平台中用的是Delphi6
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-13 10:41:24 | 显示全部楼层

就是delphi6 ,

就是delphi6+sp2 ,上次我使用TTCPServer,TTCPClient控件做为第三方控件,发现有客户端接收不到Server消息的情况,就改用ServerSocket,ClientSocket在实现。代码在Delphi6中是成功的。
但是若还是把Delphi6中的ServerSocket做第三控件引入x3,则应该会出类已经存在的错误。
x3客户端代码:
procedure TDemoClient.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  MsgRecv,msgCmd,msgContent,msgSendData:string;
  iLength:Integer;
begin
  try
  begin
MsgRecv:=Socket.ReceiveText;
  Memo2.Lines.Add(MsgRecv);
  //取前10位,得到协议标志符
  msgCmd:=StringUtils.Copy(MsgRecv,1,10);
  if msgCmd=MP_ACCEPT then
  ……。
   end;
Delphi Server的代码:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  msgr,msgCmd,msgContent,xmlResult:string;
  iLength,BuffSize:Integer;
begin
try
   begin
     //接收数据
   msgr:=Socket.ReceiveText;
     memo1.Lines.Add(msgr);
    //取前10个字符
   msgCmd:=Copy(msgr,1,10);
    if msgCmd=MP_CONN then
    begin
       memo2.Lines.Add ('服务器准备接收!');
     Socket.SendText(MP_ACCEPT); //发数据给Client
两边都是使用noBlocking,目前情况是ServerSocket可以接收Client消息,但是
Socket.SendText(MP_ACCEPT); //发数据给Client,上面的Client函数无响应。
回复 支持 反对

使用道具 举报

发表于 2008-5-13 10:42:13 | 显示全部楼层
楼主,
1.发个完整的在Delphi中的Server和Client端代码
2.再发一下在平台中写的代码
我们也好判断一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-13 11:33:41 | 显示全部楼层

谢谢,下面是代码

附件中是代码。
x3Client的代码x3ClientCode.txt,

socketdemo.rar

21.69 KB, 下载次数: 71

回复 支持 反对

使用道具 举报

发表于 2008-5-13 13:27:52 | 显示全部楼层
楼主,好像是X3中的ClientSocket1没有给事件赋值!
procedure TDemoClient.BizFormCreate(Sender: TObject);
begin
     ClientSocket1:=TClientSocket.Create(Self);
     ClientSocket1.ClientType:=TClientType.ctNonBlocking;
     ClientSocket1.OnRead := ClientSocket1Read;    //这句
end;

之后请反馈!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-13 14:42:28 | 显示全部楼层

谢谢,是这样的

真的可以,太感谢了。
我对Delphi不太熟悉,为什么我在Delphi中不须要这样写,而x3中要这样写呢?
另外请帮我看一下如何异常处理行不?
当x3发消息,Server超时不处理,弹出报错,该如何写?连接服务器不成功在open中写try就行么?怎么好象没有弹出对话框?
谢谢~
procedure TDemoClient.btnStartClick(Sender: TObject);
begin
  try
     ClientSocket1.Open;
   //发送连接请求
   except
       on e:exception do
        Dialogs.ShowMessage('连接失败!'+e.Message);
   end;
回复 支持 反对

使用道具 举报

发表于 2008-5-13 14:59:58 | 显示全部楼层
1.delphi中你直接用的是拖拽控件,在双击写事件代码时,已经自动绑定其事件了,而X3是手动Create的,所以事件也要代码指定其响应函数

2.我也不太清楚捕捉当前具体错误的方法.一般直接提示"服务器连接超时"就行了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-12 22:12 , Processed in 0.048565 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表