海量数据SOCKET通讯的探讨,up给分! 问题:一秒钟内将上千个点的数据(报括name和对应的value)发送给客户端(20个client左右),该如何组织数据结构,怎样的通讯模式?建议采用UDP连接.可顺便提供类似的源代码! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 “超级猛料”里有关于UDP广播的示例原码,看看吧!!(超级猛料CSDN有下载) 请高手点评一下下面的代码!!!!!!!!!!!!!!!!!本人测试结果:100局域网之间,1秒内可以传输5000字节的数据buf.unit udp;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, winsock, StdCtrls;const WM_SOCK = WM_USER + 1; //自定义windows消息 UDPPORT = 6767; //设定UDP端口号type Tfrmmain = class(TForm) Button1: TButton; Edit1: TEdit; Memo1: TMemo; Edit2: TEdit; Label1: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); private { Private declarations } s: TSocket; addr: TSockAddr; FSockAddrIn : TSockAddrIn; //利用消息实时获知UDP消息 procedure ReadData(var Message: TMessage); message WM_SOCK; public { Public declarations } procedure SendData(Content: String); end;var frmmain: Tfrmmain;implementation{$R *.DFM}procedure Tfrmmain.FormCreate(Sender: TObject);var TempWSAData: TWSAData;begin// 初始化SOCKET if WSAStartup($101, TempWSAData)=1 then showmessage('StartUp Error!'); s := Socket(AF_INET, SOCK_DGRAM, 0); if (s = INVALID_SOCKET) then //Socket创建失败 begin showmessage(inttostr(WSAGetLastError())+' Socket创建失败'); CloseSocket(s); end; //发送方SockAddr绑定 addr.sin_family := AF_INET; addr.sin_addr.S_addr := INADDR_ANY; addr.sin_port := htons(UDPPORT); if Bind(s, addr, sizeof(addr)) <> 0 then begin showmessage('bind fail'); end; WSAAsyncSelect(s, frmmain.Handle , WM_SOCK, FD_READ); //接收端SockAddrIn设定 FSockAddrIn.SIn_Family := AF_INET; FSockAddrIn.SIn_Port := htons(UDPPORT);end;procedure Tfrmmain.FormClose(Sender: TObject; var Action: TCloseAction);begin CloseSocket(s);end;procedure Tfrmmain.ReadData(var Message: TMessage);var buffer: Array [1..40960] of char; len: integer; flen: integer; Event: word; value: string;begin flen:=sizeof(FSockAddrIn); FSockAddrIn.SIn_Port := htons(UDPPORT); Event := WSAGetSelectEvent(Message.LParam); if Event = FD_READ then begin len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen); value := copy(buffer, 1, len); memo1.Lines.Clear; Memo1.Lines.add(value) end;end;procedure Tfrmmain.SendData(Content: String);var value{,hostname}: string; len: integer;begin FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(Edit1.text)); //INADDR_BROADCAST; //INADDR_BROADCAST = -1 ? value := Content; len := sendto(s, value[1], Length(value), 0, FSockAddrIn, sizeof(FSockAddrIn)); if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then showmessage(inttostr(WSAGetLastError())); if len = SOCKET_ERROR then showmessage('send fail'); if len <> Length(value) then showmessage('Not Send all');end;procedure Tfrmmain.Button1Click(Sender: TObject);begin senddata(Edit2.text);end;end. 如何操作结果集? 关于TImage控件坐标的问题 delphi 如何实现采集一个网页 ListBox1.ItemIndex等于TreeView1里面的什么? 在ADOQuery1AfterPost事件里能否得到ADOQuery1更新前和更新后的值(目前更新项目都是数字) 那些程序在微软新推出的操作系统下无法正常运行? 安装delphi控件.DPK的问题。。。 怎样去掉MDI中的滚动条???? delphi中的sql的小问题!谢谢! 加急!!!谁发给我一个EXCEL的图标啊?50小分相送。 关于Tobject的参数 转:宝兰,和春天有个约会
(超级猛料CSDN有下载)
本人测试结果:100局域网之间,1秒内可以传输5000字节的数据buf.unit udp;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, winsock,
StdCtrls;const
WM_SOCK = WM_USER + 1; //自定义windows消息
UDPPORT = 6767; //设定UDP端口号type
Tfrmmain = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
s: TSocket;
addr: TSockAddr;
FSockAddrIn : TSockAddrIn;
//利用消息实时获知UDP消息
procedure ReadData(var Message: TMessage);
message WM_SOCK;
public
{ Public declarations }
procedure SendData(Content: String);
end;var
frmmain: Tfrmmain;implementation{$R *.DFM}procedure Tfrmmain.FormCreate(Sender: TObject);
var
TempWSAData: TWSAData;
begin
// 初始化SOCKET
if WSAStartup($101, TempWSAData)=1 then
showmessage('StartUp Error!');
s := Socket(AF_INET, SOCK_DGRAM, 0);
if (s = INVALID_SOCKET) then //Socket创建失败
begin
showmessage(inttostr(WSAGetLastError())+' Socket创建失败');
CloseSocket(s);
end;
//发送方SockAddr绑定
addr.sin_family := AF_INET;
addr.sin_addr.S_addr := INADDR_ANY;
addr.sin_port := htons(UDPPORT);
if Bind(s, addr, sizeof(addr)) <> 0 then
begin
showmessage('bind fail');
end;
WSAAsyncSelect(s, frmmain.Handle , WM_SOCK, FD_READ);
//接收端SockAddrIn设定
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(UDPPORT);
end;procedure Tfrmmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseSocket(s);
end;procedure Tfrmmain.ReadData(var Message: TMessage);
var
buffer: Array [1..40960] of char;
len: integer;
flen: integer;
Event: word;
value: string;
begin
flen:=sizeof(FSockAddrIn);
FSockAddrIn.SIn_Port := htons(UDPPORT);
Event := WSAGetSelectEvent(Message.LParam);
if Event = FD_READ then
begin
len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
value := copy(buffer, 1, len);
memo1.Lines.Clear;
Memo1.Lines.add(value)
end;
end;procedure Tfrmmain.SendData(Content: String);
var
value{,hostname}: string;
len: integer;
begin FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(Edit1.text)); //INADDR_BROADCAST; //INADDR_BROADCAST = -1 ?
value := Content;
len := sendto(s, value[1], Length(value), 0, FSockAddrIn, sizeof(FSockAddrIn));
if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
showmessage(inttostr(WSAGetLastError()));
if len = SOCKET_ERROR then
showmessage('send fail');
if len <> Length(value) then
showmessage('Not Send all');
end;procedure Tfrmmain.Button1Click(Sender: TObject);
begin senddata(Edit2.text);
end;end.