服务器向客户端发送信息的问题(50分)

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

cnbobo

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器端liskbox1已经有了连接客户端在机器名,服务器和客户端都有clientsocket1和
ServerSocket1,端口都是100;现在服务器要向连接的客户端发送信息,我要怎么办。

下面这段程序只有一台机器连接时可行,多了不行,请各位大侠帮帮忙!![:)]
procedure TForm1.SpeedButton1Click(Sender: TObject);
var i:integer;
begin
for i := 0 to Listbox1.items.count -1 do
begin
edit1.Text:=listbox1.items;
with clientsocket1 do
begin
if active then
begin
active:=false;
connectflag:=false;
end;
//ServerSocket1.Socket.Connections;
host:=listbox1.items;
active:=true;
end;
end;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
connectflag:=true;
if connectflag then
clientsocket1.socket.SendText('与服务器连接失败!')
end;
 
为什么没人回答,看的大侠帮我提前,谢谢!
 
你倒底想要干什么?是服务器端向客户发数据,还是反过来?
你的要求好象和DEMO中的CHAT基本相同,可以参考!
另外,唯一的不同是你可以从列表框中选择接收消息的对象。
如果使用短连接(发完后马上断开),则在连接成功的事件中发送消息,然后断开。
 
我是要服务器端向客户发数据,每个客户端都收到“'与服务器连接失败!'”这句话就行了。
 
首先,你定义的connectflag是没用的变量,可以删除,除非你有另用。
你和一台机器可以而多台不行,问题主要是出现在for语句里。因为你在循环里刚刚设
actvie :=true,就马上进入了下一个循环对于clienttype = ctNonBlocking的socket,
这时可能还不能和server建立连接,所以发送不了数据。就算是建立了连接,也可能由于你
设active:=false而导致发送失败。你可以在for循环中做个时间延时,可能就会好了,或者
你设一个变量,只有连接和发送消息成功后再进行下一个连接。
还有,下面的代码最好改为:
connectflag:=true;
if connectflag then
clientsocket1.socket.SendText('与服务器连接失败!')


if socket.Connected then
clientsocket1.socket.SendText('与服务器连接失败!')

 
for循环中做个时间延时,怎么做?我也想到,我用断点测试成功过。
能不能在仔细讲讲。还没有没其它办法
 
socket需要双方建立信道才能传送信息,也就是一个接,一个收才行
建议参考一下/demos/../chat例程
 
短点的时候就是有了延时,所以你成功了。
你在for语句的条件改为:

while active = false then
begin
if i = 0 then break;
sleep(1000);
//此出可以加一个退出条件,避免死循环
end;
active := false;
 
to: star_survior
我现在一个收,一个发没问题。我要实现的是一个发,多个收(连的机器才能收)
 
用ServerSocket1.Socket.Connections取得clientsocket句柄
新建一个Tcustomwinsocket.Create(),循环发,
我现在不方便给例子,原理是这样
 
TO: chenxz,我延时sleep(10000)都不行,延时不是好办法,在网络中连接速度不同没法控制
延时,延时太长就体现不出同步了。
TO:star_survior如果有空,请给个例子,谢谢!![:D]
 
或者你直接用serversocket1的连接来做好了。
for i:= 0 to ServerSocket1.Socket.ActiveConnections -1 do
begin
ServerSocket1.Socket.Connections.SendText('sndstr');
end;
 
to: chenxz
这段程序我试了不行,我在其它贴子也看到过。能不能说的详细点。
 
不太可能吧,除非你接收的端口不对。把你的代码贴出来看看。
 
端口肯定对的,要不我在服务器端得不到客户端的机器名了。
我的源码:
服务器端:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
str:=pchar(socket.ReceiveText);
listbox1.ItemIndex:=listbox1.Items.IndexOf(strpas(str));
if listbox1.ItemIndex=0 then
listbox1.Items.Delete(listbox1.ItemIndex)
else
listbox1.Items.Add(strpas(str));
end;
客户端:
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
connectflag:=true;
if connectflag then
begin
clientsocket1.Socket.SendText(edit2.Text);
statusbar1.Panels[0].Text:='与服务器连接正常!';
form1.SpeedButton1.Enabled:=false;
end
else
application.MessageBox(pchar('不能连接'+server+'服务器!'),'Client_yuding',0+16);

end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
application.MessageBox(pchar('不能连接'+server+'服务器!'),'Client_yuding',0+16);
errorcode:=0;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
with clientsocket1 do
begin
if Active then
begin
active:=false;
connectflag:=false;
end;
host:=server;//服务器IP,机器名
active:=true;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
speedbutton3.Click;
speedbutton4.Click;
if server='' then
form2.ShowModal
else
begin
edit1.Text:=server;
speedbutton1.Click;
end;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
form2.ShowModal;
end;


procedure TForm1.SpeedButton3Click(Sender: TObject);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('/',True)
then server:=reg.READSTRING('server');
finally
Reg.CloseKey;
Reg.Free;
inherited;
end;
end;

procedure TForm1.SpeedButton4Click(Sender: TObject);
var computername:pchar;
size:cardinal;
re:boolean;
begin
size:=max_computername_length+1;
getmem(computername,size);
re:=getcomputername(computername,size);
if re then
begin
client:=strpas(computername);
edit2.Text:=client;
end
else
showmessage('服务器不能获得本机名!');
freemem(computername);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if connectflag then
clientsocket1.Socket.SendText(edit2.Text);
end;
端口都是100,在属性窗口已设好。
 
我这个代码是可以的,你试一下:
servser:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Recv:String;
begin
Recv := Socket.ReceiveText;
listbox1.ItemIndex:=listbox1.Items.IndexOf(Recv);
if listbox1.ItemIndex <>0 then
listbox1.Items.Add(Recv);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do
begin
ServerSocket1.Socket.Connections.SendText('连接测试');
end;
end;

client:


procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
connectflag:=true;
if connectflag then
begin
clientsocket1.Socket.SendText(edit2.Text);
statusbar1.Panels[0].Text:='与服务器连接正常!';
form1.SpeedButton1.Enabled:=false;
end
else
application.MessageBox(pchar('不能连接'+server+'服务器!'),'Client_yuding',0+16);


end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
application.MessageBox(pchar('不能连接'+server+'服务器!'),'Client_yuding',0+16);
errorcode:=0;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
with clientsocket1 do
begin
if Active then
begin
active:=false;
connectflag:=false;
end;
host:=server;//服务器IP,机器名
active:=true;
end;

end;

procedure TForm1.FormShow(Sender: TObject);
begin
speedbutton3.Click;
speedbutton4.Click;
server := '127.0.0.1'; //改变了这里,不用读取注册表
begin
edit1.Text:=server;
speedbutton1.Click;
end;

end;

procedure TForm1.SpeedButton4Click(Sender: TObject);
var computername:pchar;
size:cardinal;
re:boolean;
begin
size:=max_computername_length+1;
getmem(computername,size);
re:=getcomputername(computername,size);
if re then
begin
client:=strpas(computername);
edit2.Text:=client;
end
else
showmessage('服务器不能获得本机名!');
freemem(computername);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if connectflag then
clientsocket1.Socket.SendText(edit2.Text);

end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage(Socket.ReceiveText);
end;
 
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage(Socket.ReceiveText);
end;
行了,全靠这段谢谢!!!!!!![:D][:D]
 
后退
顶部