serversocket,clientsocket(20分)

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

cd_fsy

Unregistered / Unconfirmed
GUEST, unregistred user!
回复贴子:
回复人: cd_fsy2000(书到学时恨他多,钱到用时方恨少) (2001-11-2 17:44:14) 得0分
各位老大,小弟现有一事相求:
是这样的,有一收银系统有四界面需动态实时刷新(c/s结构)客户端用clientsocket和
serversocket ,
1:更衣室(客人出)刷新收银界面(有两台电脑)
2:买单界面(客人买单)刷新收银界面,鞋房界面(两台电脑),更衣室界面(两台电脑);
本系统只有一前台收银系统,后台无系统,只有一数据库,和一查询统计程序;
请问我该怎么作?
用clientsocket向server发消息,server 又怎样接收,server又 怎样把消息转发到其它工作站?




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

小弟现修改一桑那收银系统,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:买单界面(客人买单)刷新收银界面,鞋房界面(两台电脑),更衣室界面(两台电脑);
本系统只有一前台收银系统,后台无系统,只有一数据库,和一查询统计程序;

回复人: cd_fsy2000(书到学时恨他多,钱到用时方恨少) (2001-11-5 10:45:27) 得0分
3Server接收:Read事件里用receivetext:=socket.receivetext;
4广播:for i:=0 to ServerSocket1.Activeconnection - 1 do
begin
ServerSocket1.socket.connections.sendtext('Received');
end;

运行时提示:Activeconnection没有定义,我该怎么做?
回复人: gzmhero(hihihi) (2001-11-5 11:16:12) 得0分
你的思路需要整理一下,你为什么在客户端放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 then
ServerSocket1.Socket.Connections.SendText('refresh');
end;


又出错了。我在更衣室输入两个手牌号(客人进场)后,又将一个一个结掉(客人出场)
每结掉一个我就向server 发送一个消息,server 收到后就将该消息又发送到其他工作站
其他工作站收到后就刷新。
现在是这样的:结掉一个手牌号后其他工作站可以刷新,但再结掉一个后其他工作站就不刷新了
我用断点调试后发现server 是收到消息的并且发送出去了的,但工作站没反应,这是为什么?
有什么方法可以解决吗?
回复人: cd_fsy2000(书到学时恨他多,钱到用时方恨少) (2001-11-6 12:22:42) 得0分
又出错了。我在更衣室输入两个手牌号(客人进场)后,又将一个一个结掉(客人出场)
每结掉一个我就向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.sendtext(receivetext);
end;
end;
这样对吗?还是代码或事件有问题?
这时是收到消息的并且发送出去了的,但工作站没反应,这是为什么?
有什么方法可以解决吗?


 
服务器端用阻塞多线程方式吧,不然你是不可能成功的
 
server端用阻塞多线程方式,是不是在serversocket 的servertype属性中设为stThreadBlocking
就行了。其他事件或代码要增加或修改吗?
 
刚注册大富翁
怎么看不到答案呀??
 
后退
顶部