indy udpserver client,搞一天了,帮忙看下错哪,应该简单 ( 积分: 100 )

  • 主题发起人 主题发起人 故居
  • 开始时间 开始时间

故居

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
strMsg, s: string;
l: int64;
mm: TMemoryStream;
begin
l := adata.Size;
memo1.Lines.Add('第' + inttostr(tc) + '次接受,长度为' + inttostr(l) + '。');

strMsg := '对方:Ip:=' + ABinding.PeerIp + ',Port:=' + IntToStr(ABinding.PeerPort);
Memo1.Lines.Add(strMsg);
strMsg := '自己:Ip:=' + ABinding.Ip + ',Port:=' + IntToStr(ABinding.Port);
Memo1.Lines.Add(strMsg);

mm := TMemoryStream.Create;
try
mm.CopyFrom(aData, l);
mm.position:=0;
setlength(s, l);
mm.Read(s, l);
memo1.Lines.add(string(s));//错误见下面说明
finally
mm.Free;
end;
end;
只是想接受并显示接受的文字信息,可是就是无法显示。
这段代码是别人用来接受图像的。我改成接受文字,就是不给显示,有时候
还出现程序错误。
请熟悉indy的战友给个分析,或简单的能正常工作的例子。
搞一天,查了资料,多是接受图像的那个例子。
多谢!
 
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
strMsg,s: string;
l: int64;
begin
AData.Seek(0,0);
SetLength(S,AData.Size);
AData.Read(S[1],AData.Size);
l:=length(s);
memo1.Lines.Add('第' + inttostr(tc) + '次接受,长度为' + inttostr(l) + '。');
strMsg := '对方:Ip:=' + ABinding.PeerIp + ',Port:=' + IntToStr(ABinding.PeerPort);
Memo1.Lines.Add(strMsg);
strMsg := '自己:Ip:=' + ABinding.Ip + ',Port:=' + IntToStr(ABinding.Port);
Memo1.Lines.append(strMsg);
memo1.Lines.append(s);//错误见下面说明
end;
end;
 
发了10次‘send data’

第1次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098

第2次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098

第3次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098
LL
第4次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098
M
第5次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098

第6次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098
第7次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098
pN
第8次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098

第9次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098
PO
第10次接受,长度为9。
对方:Ip:=172.16.20.19,Port:=1078
自己:Ip:=0.0.0.0,Port:=9098
 
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
l: integer;
mm: Tmemorystream;
begin
s := trim(edit1.Text);
l := length(s);
if l <= 0 then exit;
mm := TMemoryStream.Create;
try
mm.Write(s, l);
idudpclient1.SendBuffer(192.168.1.255', 9098, mm.memory^, mm.Size);
finally
mm.Free;
end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
idudpserver1.DefaultPort := 9098;
idudpserver1.Active := True;

idudpclient1.BroadcastEnabled := true;
end;

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
strMsg, s: string;
l: int64;
mm: TMemoryStream;
s1:array of char;
begin
inc(tc);
AData.Seek(0,0);
SetLength(S,AData.Size);
AData.Read(S[1],AData.Size);
l:=length(s);
memo1.Lines.Add('第' + inttostr(tc) + '次接受,长度为' + inttostr(l) + '。');
strMsg := '对方:Ip:=' + ABinding.PeerIp + ',Port:=' + IntToStr(ABinding.PeerPort);
Memo1.Lines.Add(strMsg);
strMsg := '自己:Ip:=' + ABinding.Ip + ',Port:=' + IntToStr(ABinding.Port);
Memo1.Lines.append(strMsg);
memo1.Lines.append(s);//错误见下面说明

end;
 
一个程序自己跟自己发消息的,
接受结果如上面
 
发送端 不要用流!
 
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := trim(edit1.Text);
IdUDPClient1.Host:='192.168.1.255';
IdUDPClient1.port:=9098;
IdUDPClient1.Active:=True;
IdUDPClient1.Send(s);
end;
别搞的那摸复杂!
 
發送方式用 caojianli 的方法, 接收請改為下面的方法試試。
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
sMsg: string;
begin
SetLength(sMsg, AData.Size);
AData.Read(sMsg[1], AData.Size);
memo1.Lines.Add('第' + inttostr(tc) + '次接受,长度为' + inttostr(adata.Size) + '。');
Memo1.Lines.Add('对方:Ip:=' + ABinding.PeerIp + ',Port:=' + IntToStr(ABinding.PeerPort));
Memo1.Lines.Add('自己:Ip:=' + ABinding.Ip + ',Port:=' + IntToStr(ABinding.Port));
memo1.Lines.add(sMsg)
end;
 
to caojianli guanyueguan
改了发送方法就可以了。
,我不是要搞的复杂,我就是想发送应该是个普通适用的方法,
就是说我到时候发图片和发文字用一个方法就可以了

为什么用流发文字就不行呢,盼各位有心人解答下啊
 
有沒有郵箱,我發一個程序給你,混合發文字圖片的例子。
 
簡單實現,沒有控制,要用好的話加點控制就行了。
服務器:
-------------------------------------------------------------------------------
unit SvrMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPServer, IdSocketHandle;

type
TfrmServer = class(TForm)
mmoA: TMemo;
idusA: TIdUDPServer;
pnl1: TPanel;
lbl1: TLabel;
edtPort: TEdit;
btnSet: TButton;
procedure idusAUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure btnSetClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

TDataHeader = packed record
Cmd: Byte;
Len: Integer;
end;

var
frmServer: TfrmServer;
FHeaded: Boolean;
FHeader: TDataHeader;
FRecCount: Integer;
FStream: TMemoryStream;
implementation

{$R *.dfm}

procedure TfrmServer.btnSetClick(Sender: TObject);
begin
try
idusA.Active := False;
idusA.DefaultPort := StrToInt(edtPort.Text);
idusA.Active := True;
FHeaded := False;
btnSet.Enabled := False;
except
ShowMessage('Set error!');
end;
end;

procedure TfrmServer.idusAUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
buf : PChar;
nLen: Integer;
begin
if not FHeaded then
begin
FRecCount := 0;
AData.Read(FHeader, SizeOf(TDataHeader));
if FHeader.Cmd = 0 then
begin
mmoA.Lines.Add('receive a text from ' + ABinding.PeerIP + ':');
end
else
begin
if Assigned(FStream) then
FreeAndNil(FStream);
FStream := TMemoryStream.Create;
mmoA.Lines.Add('receive a jpg from ' + ABinding.PeerIP);
end;
FHeaded := True;
end
else
begin
if FHeader.Len - FRecCount > 1024 then
nLen := 1024
else
nLen := FHeader.Len - FRecCount;
if nLen > AData.Size then
nLen := AData.Size;
GetMem(buf, nLen);
ZeroMemory(buf, nLen);
try
AData.ReadBuffer(buf^, nLen);
FRecCount := FRecCount + nLen;
if FHeader.Cmd = 0 then
begin
mmoA.Lines.Add(buf);
FHeaded := False;
end
else
begin
FStream.WriteBuffer(buf^, nLen);
if FRecCount >= FHeader.Len then
begin
FStream.SaveToFile('c:/1.jpg');
FreeAndNil(FStream);
FHeaded := False;
mmoA.Lines.Add('save to c:/1.jpg.');
end;
end;
finally
FreeMem(buf, nLen);
end;
end;
end;

procedure TfrmServer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Assigned(FStream) then
FreeAndNil(FStream);
end;

end.

******************************************************************************

客戶端:
-----------------------------------------------------------------------------
unit CltMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;

type
TfrmClient = class(TForm)
iducA: TIdUDPClient;
lbl1: TLabel;
edtA: TEdit;
btnSendT: TButton;
lbl2: TLabel;
edtB: TEdit;
btnSendF: TButton;
lbl3: TLabel;
edtHost: TEdit;
edtPort: TEdit;
Label1: TLabel;
btnSet: TButton;
procedure btnSetClick(Sender: TObject);
procedure btnSendTClick(Sender: TObject);
procedure btnSendFClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TDataHeader = packed record
Cmd: Byte;
Len: Integer;
end;

var
frmClient: TfrmClient;

implementation

{$R *.dfm}

procedure TfrmClient.btnSetClick(Sender: TObject);
begin
try
iducA.Host := edtHost.Text;
iducA.Port := StrToInt(edtPort.Text);
iducA.Active := True;
btnSet.Enabled := False;
btnSendT.Enabled := True;
btnSendF.Enabled := True;
except
ShowMessage('Host or Port Error!');
btnSet.Enabled := True;
btnSendT.Enabled := False;
btnSendF.Enabled := False;
end;
end;

procedure TfrmClient.btnSendTClick(Sender: TObject);
var
dh : TDataHeader;
buf : PChar;
nLen: Integer;
begin
nLen := Length(edtA.Text) + 1;
if (not iducA.Active) or (nLen < 2) then
Exit;
btnSendT.Enabled := False;
GetMem(buf, nLen);
ZeroMemory(buf, nLen);
try
CopyMemory(buf, PChar(edtA.Text), nLen - 1);
dh.Cmd := 0;
dh.Len := nLen;
iducA.SendBuffer(dh, SizeOf(TDataHeader));
iducA.SendBuffer(buf^, nLen);
finally
FreeMem(buf, nLen);
btnSendT.Enabled := True;
end;
end;

procedure TfrmClient.btnSendFClick(Sender: TObject);
var
dh : TDataHeader;
buf : PChar;
nSend : Integer;
nLen : Integer;
FStream : TMemoryStream;
begin
if not FileExists(edtB.Text) then
begin
ShowMessage('File not found!');
Exit;
end;
FStream := TMemoryStream.Create;
GetMem(buf, 1024);
ZeroMemory(buf, 1024);
try
btnSendF.Enabled := False;
FStream.LoadFromFile(edtB.Text);
FStream.Position := 0;
dh.Cmd := 1;
dh.Len := FStream.Size;
iducA.SendBuffer(dh, SizeOf(TDataHeader));
nSend := 0;
while nSend < FStream.Size do
begin
if FStream.Size - nSend > 1024 then
nLen := 1024
else
nLen := FStream.Size - nSend;
FStream.ReadBuffer(buf^, nLen);
iducA.SendBuffer(buf^, nLen);
nSend := nSend + nLen;
Sleep(10);
end;
finally
FreeAndNil(FStream);
FreeMem(buf, 1024);
btnSendF.Enabled := True;
end;
end;

end.
 
to guanyueguan
多谢战友挂念,
cncooljun@163.com
正在研究你的代码
 
后退
顶部