客户端和服务器端各用一个UDP,本地端口和远程端口互为相反. 客户端: ... procedure TForm1.Button1Click(Sender: TObject); var MyStream:TStringStream; begin MyStream:=TStringStream.Create(Memo1.Text); NMUDPClient.SendStream(MyStream); end;服务器端: ...procedure TForm1.NMUDPServerDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var MyStream:TStringStream; i:integer; begin MyStream:=TStringStream.Create(''); NMUDPServer.ReadStream(MyStream); Memo1.Lines.LoadFromStream(MyStream); for i:=0 to Memo1.Lines.Count-1 do begin ADODataSet1.Append; ADODataSet1.FieldByName('ZD').asString:=Memo1.Lines.Strings[i]; Memo1.Lines.Strings[i].Post; end;
如果要求信息一条不漏保证顺序的上传就用TCP,程序写起来也很简单。 以下例子使用了Indy的TCP组件,实现了客户端与服务器端MEMO的同步,相信略加修改就能满足楼主需求。 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;type TForm1 = class(TForm) IdTCPClient1: TIdTCPClient; IdTCPServer1: TIdTCPServer; Memo1: TMemo; Memo2: TMemo; procedure FormCreate(Sender: TObject); procedure IdTCPServer1Execute(AThread: TIdPeerThread); procedure Memo1Change(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); begin with IdTCPServer1 do begin Active:=False; Bindings.Clear; Bindings.Add.Port:=1981; Active:=True; end; with IdTCPClient1 do begin Host:='127.0.0.1'; Port:=1981; Connect; end; end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var i,rn:Integer; begin try with AThread,Connection do begin rn:=ReadInteger; if rn>0 then Memo2.Lines.Clear; for i:=1 to rn do Memo2.Lines.Add(ReadLn) end; except on E:Exception do AThread.Stop; end; end;procedure TForm1.Memo1Change(Sender: TObject); begin IdTCPClient1.WriteStrings(Memo1.Lines,True); end;end.
udp无连接,效率好,但是会出现丢包之类的问题,你要做好回应,然后及时处理
客户端:
...
procedure TForm1.Button1Click(Sender: TObject);
var
MyStream:TStringStream;
begin
MyStream:=TStringStream.Create(Memo1.Text);
NMUDPClient.SendStream(MyStream);
end;服务器端:
...procedure TForm1.NMUDPServerDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream:TStringStream;
i:integer;
begin
MyStream:=TStringStream.Create('');
NMUDPServer.ReadStream(MyStream);
Memo1.Lines.LoadFromStream(MyStream);
for i:=0 to Memo1.Lines.Count-1 do
begin
ADODataSet1.Append;
ADODataSet1.FieldByName('ZD').asString:=Memo1.Lines.Strings[i];
Memo1.Lines.Strings[i].Post;
end;
NMUDPClient.SendStream(MyStream);
这句有错误IdUDPClient1还是UdpSocket1
最后一名应该是
ADODataSet1.Post;
上传数据到对方的数据库用IDUDP或IDTCP请各位帮忙
以下例子使用了Indy的TCP组件,实现了客户端与服务器端MEMO的同步,相信略加修改就能满足楼主需求。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdTCPServer, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient;type
TForm1 = class(TForm)
IdTCPClient1: TIdTCPClient;
IdTCPServer1: TIdTCPServer;
Memo1: TMemo;
Memo2: TMemo;
procedure FormCreate(Sender: TObject);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure Memo1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
with IdTCPServer1 do
begin
Active:=False;
Bindings.Clear;
Bindings.Add.Port:=1981;
Active:=True;
end;
with IdTCPClient1 do
begin
Host:='127.0.0.1';
Port:=1981;
Connect;
end;
end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
i,rn:Integer;
begin
try
with AThread,Connection do
begin
rn:=ReadInteger;
if rn>0 then Memo2.Lines.Clear;
for i:=1 to rn do
Memo2.Lines.Add(ReadLn)
end;
except
on E:Exception do AThread.Stop;
end;
end;procedure TForm1.Memo1Change(Sender: TObject);
begin
IdTCPClient1.WriteStrings(Memo1.Lines,True);
end;end.