关于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;
[解决办法]
[解决办法]
ClientSocket2.Active:=True;
ClientSocket2.Open;
这两句好像执行同一个效果吧
刚发送完就断开可能会对接收有影响吧,没试过
[解决办法]
服务器没有收到吗?代码看不出问题,把服务器代码贴出来。
[解决办法]
[解决办法]
[解决办法]
我这样的代码可以,用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();”要是服务器没有返回数据,程序会一直在那边等吧。(进程死了)
[解决办法]
对,这个就要定义好协议。
[解决办法]
你的问题不是程序上的,而是设计思路上的,既然你要判断每个连接的状况,那么就是说要创建这么多对象,你只创建一个对象,每次让他连,不是要累死了吗
[解决办法]
发送操作应该在OnConnect事件发送后执行发送操作,ClientSocket2.Open返回后,未必一定连接上去了;
最好使用API
参考:
http://jian100305.host10.web-75.com/tech/questionlist.asp?q_ID=5
[解决办法]
[解决办法]
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;