| 发表于:2008-02-22 23:37:462楼 得分:0 |
要实现这个功能,方法很多,能够用的组件也很多, 但是涉及到的问题也是很多的, 选择 udp 还是 tcp/ip、穿透防火墙、穿透网管、是否需要服务器.......... 建议楼主先看看这方面的资料再决定如何下手。 以下是 indy 官方发布,用 udp 实现通讯的 demo,楼主参考一下吧。 1.客户端 {----------------------------------------------------------------------------- demo name: udp client author: <unknown - please contact me to take credit! - allen o'neill> copyright: indy pit crew purpose: history: date: 27/10/2002 01:00:36 checked with indy version: 9.0 - allen o'neill - springboard technologies ltd - http://www.springboardtechnologies.com ----------------------------------------------------------------------------- notes: simple udp client demo } unit udpclientmain; interface uses windows, messages, graphics, controls, forms, dialogs, idwinsock2, stdctrls, sysutils, classes, idbasecomponent, idantifreezebase, idantifreeze, idcomponent, idudpbase, idudpclient, idstack; type tudpmainform = class(tform) sourcegroupbox: tgroupbox; hostnamelabel: tlabel; hostaddresslabel: tlabel; hostname: tlabel; hostaddress: tlabel; udpantifreeze: tidantifreeze; portlabel: tlabel; port: tlabel; destinationlabel: tlabel; destinationaddress: tlabel; buffersizelabel: tlabel; buffersize: tlabel; udpmemo: tmemo; sendbutton: tbutton; udpclient: tidudpclient; procedure formcreate(sender: tobject); procedure sendbuttonclick(sender: tobject); private { private declarations } public { public declarations } end; var udpmainform: tudpmainform; implementation const hostnamelength = 80; recievetimeout = 5000; // milliseconds {$r *.dfm} procedure tudpmainform.formcreate(sender: tobject); begin randomize; // remove if you want reproducible results. hostname.caption := udpclient.localname; hostaddress.caption := gstack.localaddress; port.caption := inttostr(udpclient.port); destinationaddress.caption := udpclient.host; buffersize.caption := inttostr(udpclient.buffersize); udpclient.receivetimeout := recievetimeout; end; procedure tudpmainform.sendbuttonclick(sender: tobject); var messageid: integer; thismessage: string; receivedstring: string; begin messageid := random(maxint); thismessage := 'message: ' + inttostr(messageid); udpmemo.lines.add('sending ' + thismessage); udpclient.send(thismessage); receivedstring := udpclient.receivestring(); if receivedstring = '' then udpmemo.lines.add('no response received from the server after ' + inttostr(udpclient.receivetimeout) + ' millseconds.') else udpmemo.lines.add('received: ' + receivedstring) end; end. 2.服务器端 {----------------------------------------------------------------------------- demo name: udp server author: <unknown - please contact me to take credit! - allen o'neill> copyright: indy pit crew purpose: history: date: 27/10/2002 01:00:36 checked with indy version: 9.0 - allen o'neill - springboard technologies ltd - http://www.springboardtechnologies.com ----------------------------------------------------------------------------- notes: simple udp server demo } unit udpservermain; interface uses windows, messages, graphics, controls, forms, dialogs, idwinsock2, stdctrls, sysutils, classes, idbasecomponent, idantifreezebase, idantifreeze, idcomponent, idudpbase, idudpclient, idstack, idudpserver, idsockethandle; type tudpmainform = class(tform) sourcegroupbox: tgroupbox; hostnamelabel: tlabel; hostaddresslabel: tlabel; hostname: tlabel; hostaddress: tlabel; udpserver: tidudpserver; udpantifreeze: tidantifreeze; portlabel: tlabel; port: tlabel; buffersizelabel: tlabel; buffersize: tlabel; udpmemo: tmemo; procedure formcreate(sender: tobject); procedure udpserverudpread(sender: tobject; adata: tstream; abinding: tidsockethandle); private { private declarations } public { public declarations } end; var udpmainform: tudpmainform; implementation const hostnamelength = 80; {$r *.dfm} procedure tudpmainform.formcreate(sender: tobject); begin hostname.caption := udpserver.localname; hostaddress.caption := gstack.localaddress; port.caption := inttostr(udpserver.defaultport); buffersize.caption := inttostr(udpserver.buffersize); udpserver.active := true; end; procedure tudpmainform.udpserverudpread(sender: tobject; adata: tstream; abinding: tidsockethandle); var datastringstream: tstringstream; s: string; begin datastringstream := tstringstream.create(''); try datastringstream.copyfrom(adata, adata.size); udpmemo.lines.add('received "' + datastringstream.datastring + '" from ' + abinding.peerip + ' on port ' + inttostr(abinding.peerport)); s := 'replied from ' + udpserver.localname + ' to "' + datastringstream.datastring + '"'; abinding.sendto(abinding.peerip, abinding.peerport, s[1], length(s)); finally datastringstream.free; end; end; end. | | |
|