各位老大,小弟现有一事相求:
是这样的,有一收银系统有四界面需动态实时刷新(c/s结构)客户端用clientsocket和
serversocket ,
1:更衣室(客人出)刷新收银界面(有两台电脑)
2:买单界面(客人买单)刷新收银界面,鞋房界面(两台电脑),更衣室界面(两台电脑);
本系统只有一前台收银系统,后台无系统,只有一数据库,和一查询统计程序;
请问我该怎么作?
用clientsocket向server发消息,server  又怎样接收,server又 怎样把消息转发到其它工作站? 
 

解决方案 »

  1.   

    当然是自己定义一些远程控制命令。
    例如Server收到'refresh'时就调用刷新函数。
    C/S收发是这样的:
    1设定C/S的IP和端口,并且都Active
    2Client发送:ClientSocket1.socket.sendtext('refresh');
    3Server接收:Read事件里用receivetext:=socket.receivetext;
    4广播:for i:=0 to ServerSocket1.Activeconnection - 1 do
           begin
               ServerSocket1.socket.connections[i].sendtext('Received');
           end;
      

  2.   

    to: DIABL0(电脑破坏神) 小弟现只有一前台收银系统,后台无应用程序,只有一数据库sql server 2000 。是否在后台做一程序, 用serversocket向客户端发送消息,但怎么做呢?马上给分
      

  3.   

    小弟现修改一桑那收银系统,C/S结构,在本系统中有两个模块A,B其中A模块有一 窗体c
    B有一窗体d,当c执行完后,会修改库中一表的状态为‘预备’则d会自动将其查出并显示出来。我在c,d窗体上都放了clientsocket,serversocket,当c执行后小弟在c中写了以下代码:
    procedure Tfmmultijiezhang.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
    if done=true then//done为c执行后返回的为真的变量
      begin
      Memo1.Text:='成公';
      Memo1.Lines.add(Socket.ReceiveText);
      end
    else
    exit;
    end;而d如下:
    procedure Tfrmxiebu.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      ClientSocket1.Active:=true;
    if ClientSocket1.Socket.ReceiveText<>'' then
      begin
      ymdyqx.close;//刷新
      ymdyqx.open;
      end;
    end;
    都没有反应,我该怎么做?
    但serversocket又该怎么写?起什么作用?
    小弟初学,请多多指教
    是否在后台做一程序, 用serversocket向客户端发送消息,但怎么做呢?马上给分 
    我的意思是:做一程序在服务器上运行,用来接收客户端的消息,并向其他工作站广播是这样的,有一收银系统有四界面需动态实时刷新(c/s结构)客户端用clientsocket和
    serversocket(对吗?) ,
    1:更衣室(客人出)刷新收银界面(有两台电脑)
    2:买单界面(客人买单)刷新收银界面,鞋房界面(两台电脑),更衣室界面(两台电脑);
    本系统只有一前台收银系统,后台无系统,只有一数据库,和一查询统计程序;
      

  4.   

    3Server接收:Read事件里用receivetext:=socket.receivetext;
    4广播:for i:=0 to ServerSocket1.Activeconnection - 1 do
          begin
              ServerSocket1.socket.connections[i].sendtext('Received');
          end;运行时提示:Activeconnection没有定义,我该怎么做?
      

  5.   

    你的思路需要整理一下,你为什么在客户端放TServerSocket,用来做什么?
    在服务器的后台做一个服务程序,放一个TServerSocket,用来通知客户端。所有的客户端都和这个Socket连接。当一个客户端发生改变后,向服务程序的ServerSocket发送消息,服务程序接受到消息,再把消息发送到所有的客户端进行刷新就可以了。
    你的代码有问题:
    procedure Tfrmxiebu.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      ClientSocket1.Active:=true;////以前没有打开么,那么就不会产生ClientSocket1Read事件。
    你需要做如下的代码:
    客户端:
    在程序开始时要打开Socket,即ClientSocket.Open;
    当数据发生改变向服务器发送命令:ClientSocket.SendText('refresh');
    procedure TForm1.ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    var
        strCmd:string;
    begin
        strCmd:=Socket.ReceiveText;
        if strCmd='refresh' then
    ////////进行刷新处理
        else if strCmd='...' then
    ///////其他命令,进行其他处理
    end;服务程序端:
    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
        strCmd:string;
        i:integer;
    begin
        strCmd:=Socket.ReceiveText;
        if strCmd='refresh' then
            for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
                if Socket<>ServerSocket1.Socket.Connections[i] then
                    ServerSocket1.Socket.Connections[i].SendText('refresh');
    end;
      

  6.   

    谢谢gzmhero:我试一下,马上给分
      

  7.   

    又出错了。我在更衣室输入两个手牌号(客人进场)后,又将一个一个结掉(客人出场)
    每结掉一个我就向server 发送一个消息,server  收到后就将该消息又发送到其他工作站
    其他工作站收到后就刷新。
    现在是这样的:结掉一个手牌号后其他工作站可以刷新,但再结掉一个后其他工作站就不刷新了
    我用断点调试后发现server 是收到消息的并且发送出去了的,但工作站没反应,这是为什么?
    有什么方法可以解决吗?
      

  8.   

    又出错了。我在更衣室输入两个手牌号(客人进场)后,又将一个一个结掉(客人出场)
    每结掉一个我就向server 发送一个消息,server  收到后就将该消息又发送到其他工作站
    其他工作站收到后就刷新。
    现在是这样的:结掉一个手牌号后其他工作站可以刷新,但再结掉一个后其他工作站就不刷新了
    我用断点调试后发现server在接收第二个手牌号发来的消息后执行:
    (1)
    procedure Tfrmserver.ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
    serversocket1.Active :=true;
    end;
    然后再执行:
    (2)
    procedure Tfrmserver.ServerSocket1Accept(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
     IsServer := True;
    end;
    然后又跳到(1)再到(2) 最后执行
    (3)
    procedure Tfrmserver.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var receivetext:string;
        i:integer;
    begin
    receivetext:=socket.receivetext;
    //4广播:
    for i:=0 to ServerSocket1.Socket.activeconnections - 1 do
          begin
          ServerSocket1.socket.connections[i].sendtext(receivetext);
         end;
    end;
    这样对吗?还是代码或事件有问题?
    这时是收到消息的并且发送出去了的,但工作站没反应,这是为什么?
    有什么方法可以解决吗?