我想用UDP来发送一条纪录,请问NMUDP控件能实现吗?

wan_j_zhang 2001-11-23 08:51:31
SendBuff()能否发送记录?
各位谁有UDP的源代码,能否给我一份?
...全文
87 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinajavis 2002-04-01
  • 打赏
  • 举报
回复
[发送]
var
TheStudentArray: array[0..100] of char;
TmpStr: string;
TmpI: Integer;

TmpStr := Edit1.Text + '#' + Edit2.Text + '#' + Edit3.Text + '#';
for TmpI := 0 to Length( TmpStr ) - 1 do
TheStudentArray[TmpI] := TmpStr[TmpI];
NMUDP1.ReportLevel := Status_Basic;
NMUDP1.SendBuffer( TheStudentArray, Length( TmpStr ) );

[接收]
var
RecBuffer: array[0..100] of Char;
RecLen, TmpI: Integer;
RecStr: string;

NMUDP1.ReadBuffer( RecBuffer, RecLen );
SetLength( RecStr, RecLen );
for TmpI := 0 to RecLen -1 do
RecStr[TmpI] := RecBuffer[TmpI];
Memo1.Lines.Add( FromIP + ':' + RecStr );

将记录值以字符串的形式发送的,串间以特殊字符间隔区分。
接收后从字符串中获取有用信息
  • 打赏
  • 举报
回复
呵呵呵呵呵,楼上这段代码好好好好好好眼熟哦。
cz3w 2002-04-01
  • 打赏
  • 举报
回复

服务端:
unit Unit_Server;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, ScktComp,Winsock, ExtCtrls;

type
TForm1 = class(TForm)
Server: TServerSocket;
m1: TMemo;
S1: TStatusBar;
btnSend: TButton;
edtSend: TEdit;
Label1: TLabel;
Label2: TLabel;
btnOneSend: TButton;
Label3: TLabel;
Label4: TLabel;
Bevel1: TBevel;
cbxID: TComboBox;
procedure ServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure ServerAccept(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure btnSendClick(Sender: TObject);
procedure ServerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure btnOneSendClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type UsrRec=Record
SocketID:Integer;
UsrName:string;
Passwd:string;
IP:string;
ReceivingData:string;
End;

var
Form1: TForm1;
buf:string;
bEUserName,bEPasswd:Boolean;
Usr:^UsrRec;

implementation

{$R *.DFM}

procedure TForm1.ServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
Var
strIp,strHost:string;
Count:Integer;
begin
strIp:=Socket.RemoteAddress;
strHost:=Socket.RemoteHost;
M1.Lines.Add('SomeOne Login From');
M1.Lines.add(#9'SocketID:'+Inttostr(Socket.SocketHandle));
cbxID.Items.Add(Inttostr(Socket.SocketHandle));
M1.lines.add(#9'IP:'+strIp);
M1.Lines.Add(#9'Host:'+strHost);
Count:=Server.Socket.ActiveConnections;
S1.Panels.Items[1].Text:='OnLine user: '+IntToStr(Count);
end;

procedure TForm1.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
p:pchar;
length:longint;
Count,i:Integer;
begin
p:=nil;
while socket.ReceiveLength>0 do begin
length:=socket.receivelength;
Getmem(p,length);
TRY
socket.ReceiveBuf(p^,socket.receivelength);
Count:=Server.Socket.ActiveConnections;
for i:=0 to Count-1 do
Server.Socket.Connections[i].SendBuf(p^,length);
FINALLY
FreeMem(p);
END;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//start server when application run
Server.Active:=true;
S1.Panels.Items[0].Text:='Server Starts. Host:'+Server.Socket.LocalHost+' Port:'+inttostr(Server.Port);
self.Caption:=S1.Panels.Items[0].Text;
Application.Title:=S1.Panels.Items[0].Text;
S1.Panels.Items[1].Text:='OnLine user Count: '+IntToStr(Server.Socket.ActiveConnections);
end;

procedure TForm1.ServerAccept(Sender: TObject; Socket: TCustomWinSocket);
var
Tempstr:pchar;
begin
TempStr:=pchar('Welcome To Chat Test Server '#13#10);
socket.SendText(TempStr);
TempStr:=pchar('#######################################'#13#10);
socket.SendText(TempStr);
TempStr:=pchar('All your words will be sent to all online people'#13#10);
socket.SendText(TempStr);
end;

procedure TForm1.ServerClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
//Error Conditions
Case ErrorCode Of
10054:M1.lines.add('one connection is reset by remote side.');
Else
M1.Lines.Add('Error Happen, Error Code:'+InttoStr(errorCode));
End;
ErrorCode:=0;
end;

procedure TForm1.btnSendClick(Sender: TObject);
var
i:integer;
Count:Integer;
begin
Count:=Server.Socket.ActiveConnections;
for i:=0 to Count-1 do
Server.Socket.Connections[i].SendText(edtSend.text);
end;

procedure TForm1.ServerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
Var
Count:Integer;
IDIndex:Integer;
begin
M1.Lines.add('Usr Offline');
M1.Lines.add(' SocketID:'+Inttostr(Socket.SocketHandle));
IDIndex:=cbxID.Items.IndexOf( Inttostr(Socket.SocketHandle));
cbxID.Items.Delete(IDIndex);
//this event happens before user leave
Count:=Server.Socket.ActiveConnections-1;
S1.Panels.Items[1].Text:='OnLine user:'+Inttostr(Count);
end;

procedure TForm1.btnOneSendClick(Sender: TObject);
var
ID:Integer;
Socket:TCustomWinSocket;
begin
if cbxID.Text='' then
exit;
ID:=strtoint(cbxID.text);
//Create a socket with exist socket handle
Socket:=TCustomWinSocket.Create(ID);
Socket.SendText(EdtSend.text);
end;

end.


cz3w 2002-04-01
  • 打赏
  • 举报
回复
unit Unit_client;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
S1: TStatusBar;
M1: TMemo;
Client: TClientSocket;
Edit1: TEdit;
Button1: TButton;
Bevel1: TBevel;
Label1: TLabel;
edtHost: TEdit;
Label2: TLabel;
edtPort: TEdit;
btnConnect: TButton;
bntDisConnect: TButton;
procedure ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure M1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure bntDisConnectClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
TotalLen:Integer;

implementation
uses ShellAPI;
{$R *.DFM}

procedure TForm1.ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
S1.Panels.Items[0].Text:='Connect Received';
S1.Panels.items[1].text:='';
end;

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
relong:integer;
begin
re:=nil;
while socket.ReceiveLength>0 do
begin
//申请内存
re:=AllocMem(socket.receivelength);
TRY
relong:=socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.receivelength);
sBuf:=strpas(re);
Setlength(sbuf,relong);

//count lenght
TotalLen:=TotalLen+ relong;
S1.Panels.Items[1].Text:='Total Received (Byte): ' + IntToStr(TotalLen);
S1.Update();
FINALLY
freemem(re);
END;
M1.Lines.Add(sbuf);
end;
end;

procedure TForm1.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
S1.Panels.Items[0].Text:='Close Connect With Host';
S1.Panels.Items[0].Text:='';
M1.Lines.Clear;
edit1.Text:='';
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Client.Active then
Client.Close;
end;

procedure TForm1.M1Click(Sender: TObject);
begin
Edit1.SetFocus;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(self.handle,nil,Pchar(Application.EXEname),nil,nil,SW_Normal);
end;

procedure TForm1.btnConnectClick(Sender: TObject);
begin
Client.Address:=edtHost.Text;
Client.Port:=strtoint(edtPort.Text);
Client.Active:=true;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
if not Client.Active then
btnConnectClick(Sender);
Client.Socket.SendText(Edit1.Text);
edit1.SelectAll;
key:=#0;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
edtHost.Text:='10.14.61.70';
edtPort.Text:='7';
TotalLen:=0;
end;

procedure TForm1.bntDisConnectClick(Sender: TObject);
begin
Client.Active:=False;
end;

end.
客户端
火鸟李国平 2002-04-01
  • 打赏
  • 举报
回复
如果是LAN且网络状况稳定的话可以用UDP,不过TCP更安全稳定些,也不需要显示地通知发送端已成功接收了记录,建议你用TCP组件做,UDP不是很理想!
zgh1688 2002-04-01
  • 打赏
  • 举报
回复
可以发送一条记录的。但好象也有限制。
Bob7946 2001-11-23
  • 打赏
  • 举报
回复
看帮助
UDP安全传输(完整源码) 大家都知道UDP比TCP好用发送速度快很多,程序写起来也简单的多,可缺点也同样明显UDP容易丢包,而且不能自动重发也不能自动组包没有数据安全机制,发的包不能超过2K(INDY,NMUDP控件都是这样)否则就出错。 可很多需求中又需要发送大量数据包并且需要保证速度(如语音和视频通讯或者点对点点播服务。)而且有些重要的数据不允许丢包这个时候就需要安全UDP了。 有朋友可能会说那你干嘛不用TCP?TCP不就是安全的UDP吗? 主要因为 1、TCP无法很好的穿透NAT,来进行点对点通讯。 2、通讯过程中需要某些重要的命令不丢失,TCP需要首先建立连接,每个包都需要确认。这样发送速度会慢不少。 所以偶需要一个安全的UDP可以发送任意大小包,可以保证某些重要的包不会丢失,并且可以轻松穿透NAT来进行点对点通讯。 网上四处寻找未果SO自己动手写了一个。具有以下功能(本类是站在前人的肩膀上实现,基类为偶稍加修改过的NMUDP) 1、自动分包组包 2、支持一次性发送任意大小的包 3、支持安全控制 4、根据丢包率和网速度动态控制发包速度(因时间的局限此功能未很好的实现) 5、对于用户透明的接口(开发人员不用关心实现细节可以和使用其它UDP控件一样简单的使用本类)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧