首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于ClientSocket2循环发送数据的有关问题

2012-02-10 
关于ClientSocket2循环发送数据的问题for I : 0 to lsvTransitUser.Items.Count - 1 dobeginIP:lsvTrans

关于ClientSocket2循环发送数据的问题
for I := 0 to lsvTransitUser.Items.Count - 1 do
  begin
  IP:=lsvTransitUser.Items[I].SubItems.Strings[0];
  ClientSocket2.Active:=False;
  ClientSocket2.Address:=IP;
  ClientSocket2.Port:=7999;
  ClientSocket2.Active:=True;
  ClientSocket2.Open;
  ClientSocket2.Socket.SendText('1111);
  ClientSocket2.Close;
  end;

ServerSocket2已在FormCreate里设置好了,

现在我需要向一个列表框中的每个ITEMS都发送一个数据,但是我以上的代码似乎没有发送得了,

倒底是哪出了问题


[解决办法]
ClientSocket2.Active:=False; 
ClientSocket2.Address:=IP; 
ClientSocket2.Port:=7999; 
ClientSocket2.Active:=True; 
ClientSocket2.Open; 
ClientSocket2.Socket.SendText('1111); 
ClientSocket2.Close; // 还没接到你就断开了,所以你就收不到


不要在循环里面打开 关闭,就在窗体创建地时候

ClientSocket2.Active:=False; 
ClientSocket2.Address:=IP; 
ClientSocket2.Port:=7999; 
ClientSocket2.Active:=True; 
ClientSocket2.Open; 

循环里面
 for I := 0 to lsvTransitUser.Items.Count - 1 do 
begin 

ClientSocket2.Socket.SendText('1111); 

end; 



[解决办法]

探讨
但是我需要循环改变IP哦

所以必须在一个循环里

[解决办法]
ClientSocket2.Active:=True; 
ClientSocket2.Open; 
这两句好像执行同一个效果吧
刚发送完就断开可能会对接收有影响吧,没试过
[解决办法]
服务器没有收到吗?代码看不出问题,把服务器代码贴出来。
[解决办法]
探讨
我目前的问题就是,IP保存在LISTVIEW里面的,我想挨个对IP进行发送数据操作,如果目标IP收到了我发送的数据后就返回一个数据来,说‘我已经接受到数据’,这样我就能知道它在线了,现在的关键问题就是,换IP的时候CLIENTSOCKET必须关闭,重新设置IP,然后再OPEN,OPEN时我怎么才能知道已经连接上了,因为我换下个IP的时候CLIENTSOCKET又必须关闭,如果SENDTEXT后马上关闭CLIENTSOCKET的话,数据就可能发送不了,我想数据发送也是需要一定时间的。

以上整个过程都是在一个循环里执行的。

[解决办法]
探讨
引用:引用:我目前的问题就是,IP保存在LISTVIEW里面的,我想挨个对IP进行发送数据操作,如果目标IP收到了我发送的数据后就返回一个数据来,说‘我已经接受到数据’,这样我就能知道它在线了,现在的关键问题就是,换IP的时候CLIENTSOCKET必须关闭,重新设置IP,然后再OPEN,OPEN时我怎么才能知道已经连接上了,因为我换下个IP的时候CLIENTSOCKET又必须关闭,如果SENDTEXT后马上关闭CLIENTSOCKET的话,数据就可能发送不了,我想数据发送也是需要一定时间的。 以上整个过程都是在一个循环里执行的。 你每个客户端都有不一样啊,都是建立地不同的链路,与你关闭有什么关系

每个客户端都是一样的,每个客户端都是服务端,即CLIENTSOCKET和SERVERSOCKET两个控件都在同一个程中。

[解决办法]
我这样的代码可以,用tcpclient的

procedure TForm1.btnSendDataClick(Sender: TObject);
var
MyTcpClient:TTcpClient;
ID:DWORD;
Rec:string;
index, L:Integer;
begin
MyTcpClient :=TTcpClient.Create(nil);
MyTcpClient.BlockMode := bmBlocking;
MyTcpClient.Name := 'MyTempTcpClient';
MyTcpClient.OnError := TcpClient1Error;
MyTcpClient.RemoteHost := '192.168.1.123';
for index := 9707 to 9737 do
begin
MyTcpClient.RemotePort := IntToStr(index);
MyTcpClient.Open;
if MyTcpClient.Active then
begin
L := MyTcpClient.Sendln('test');
if L > 0 then
begin
ShowMessage('Port:' + IntToStr(index) + IntToStr(L));
end;
end;
MyTcpClient.Close;
end;
MyTcpClient.Free;

end;

我这有个服务器,端口是9707~9737的
------解决方案--------------------


楼上的,它的是服务器不通,和你的有不同,你的对同一个电脑的不同端口发送数据:

Delphi(Pascal) code
  for I := 0 to lsvTransitUser.Items.Count - 1 do   begin     IP:=lsvTransitUser.Items[I].SubItems.Strings[0];     ClientSocket2.Active:=False;     ClientSocket2.Address:=IP;     ClientSocket2.Port:=7999;     ClientSocket2.Active:=True;     ClientSocket2.Open;     ClientSocket2.Socket.SendText('1111);     ClientSocket2.Close;   end;
[解决办法]
用“tcpclnt1.Receiveln();”要是服务器没有返回数据,程序会一直在那边等吧。(进程死了)

探讨
楼上的,它的是服务器不通,和你的有不同,你的对同一个电脑的不同端口发送数据:
Delphi(Pascal) codefor I :=0to lsvTransitUser.Items.Count-1dobegin 
IP:=lsvTransitUser.Items[I].SubItems.Strings[0]; 
ClientSocket2.Active:=False; 
ClientSocket2.Address:=IP; 
ClientSocket2.Port:=7999; 
ClientSocket2.Active:=True; 
ClientSocket2.Open; 
ClientSocket2.Socket.SendText('1111); ClientSocket2.Close;end;
 从你的代码看没有什么问题,如果你要确认服务器收到数据了,就要服务器返回,你可以在SendText之后等待服务器的返回,服务器和客户端代码:
Delphi(Pascal) code
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Sockets, StdCtrls;type
TForm1= class(TForm)
tcpsrvr1: TTcpServer;
tcpclnt1: TTcpClient;
btnSend: TButton;procedure tcpsrvr1Accept(Sender: TObject; ClientSocket: TCustomIpClient);procedure btnSendClick(Sender: TObject);procedure FormCreate(Sender: TObject);
private{ Private declarations}
public{ Public declarations}end;var
Form1: TForm1;

implementation{$R *.dfm}procedure TForm1.btnSendClick(Sender: TObject);var
sRecv: string;begin
tcpclnt1.Open;
tcpclnt1.Sendln('1111');
sRecv := tcpclnt1.Receiveln();
tcpclnt1.Close;if sRecv='OK'then
ShowMessage('OK')else
ShowMessage('ERROR');end;procedure TForm1.FormCreate(Sender: TObject);begin
tcpsrvr1.Open;end;procedure TForm1.tcpsrvr1Accept(Sender: TObject; ClientSocket: TCustomIpClient);var
sRecv: string;begin
sRecv := ClientSocket.Receiveln();
ClientSocket.Sendln('OK');end;end.
 楼主还有什么问题可以发站内短信,如果解决问题了,希望多加点分,^_^

[解决办法]
对,这个就要定义好协议。
[解决办法]
你的问题不是程序上的,而是设计思路上的,既然你要判断每个连接的状况,那么就是说要创建这么多对象,你只创建一个对象,每次让他连,不是要累死了吗
[解决办法]
发送操作应该在OnConnect事件发送后执行发送操作,ClientSocket2.Open返回后,未必一定连接上去了;
最好使用API
参考:
http://jian100305.host10.web-75.com/tech/questionlist.asp?q_ID=5
[解决办法]
探讨
WaitForSingleObject可以监视CLIENTSOCKET的状态?

[解决办法]
for I := 0 to lsvTransitUser.Items.Count - 1 do 
begin 
IP:=lsvTransitUser.Items[I].SubItems.Strings[0]; 
ClientSocket2.Active:=False; 
ClientSocket2.Address:=IP; 
ClientSocket2.Port:=7999; 
ClientSocket2.Active:=True; 
ClientSocket2.Open; 
ClientSocket2.Socket.SendText('1111);
加个等待,
要不加个循环等他返回
如有返回退出,
设个时间 没有返回超时执行下一个
要不会死掉的
再不做个多线程
每发一个创建一个线程
ClientSocket2.Close; 
end;

热点排行