请问如何直接将粘贴板内的图形用udp协议转送到别的机器?(100分)

  • 主题发起人 主题发起人 sh9
  • 开始时间 开始时间
S

sh9

Unregistered / Unconfirmed
GUEST, unregistred user!
1.如何将Clipboard格式转换成Stream用udp协议发送出去!
2.udp协议发送<2k的信息最可靠,请问如何一部分一部分的发送?
请举例!谢谢!
 
1.Delphi中有TClipBoard可以用,大致如下

clpbrd:TClipBoard;
bm:TBitMap;
m:TMemoryStream;

clpbrd := TClipBoard.Create;
if clpbrd.HasFormat(CF_BITMAP) then
begin
bm := Tbitmap.Create;
clpbrd.GetAsHandle(bm.handle);
m := TMemoryStream.Create;
bm.SaveToStream(m);
bm.Free;
end;

2.ICQ发送udp包时,对每一个包进行编号,编号随同包一起发出,
服务器收到后向客户端发确认包,如果一个udp包发出后10秒还
没有收到确认包,就重发。
你可以看一下ICQ的协议,可能对你有所帮助。
 
(1) 将流中数据保存到一个数组中。
然后对数据分包发送

(2) 定义如下包结构:


发送包的结构:

struct stsendpacket
{
int packetsize;//data中包的有效长度,<=1024
int flag; //是否有后续包,0=无,1=有
int packetno //包序号
char data[1024];
}

//应答包结构:
struct stanswerpacket
{
int answer; //0--收到,1--重发刚才的包
};

(3)定义双方协议:

发送方处理:

i=1;
while(1)
{
计算buffer中剩余数据长度,长度大于1024,则{置flag=1 ,packetsize=1024,}否则{flag=0,packetsize=剩余数据长度}
packetno=i;
从buffer的剩余数据中拷贝packetsize到stsendpacket的data域中.
发送方发送第i个包,
设置接收超时值
等待返回
if 接收超时 则退出

if flag=0 退出


}



//在接受方
依次接收各包,当flag=0时,退出接收,
在每次接收包后,发送应答包
当flag=0时,退出接收循环
将数组强制类型转换成Stream。
再转换成TBitmap类型。 (参考danceofwind上面的代码,过程相反)

 
谢谢两位!我还想问问,关于分解Stream类型变量的细节,能不能举个简单的例子!
 
就用hl-zhw的算法,假设不需要处理应答包,
代码如下:
type
stSendPacket = record
PacketSize:integer;
Flag:integer;
PacketNo:integer;
Data:array[0..1023]of char;
end;

var
PktNo:integer;
pkt:stSendPacket;
m:TMemoryStream;
.
.
.
PktNo :=1;
m.position := 0;
while(m.size>m.Position)do
begin
if (m.size-m.position)>1024 then
begin
Pkt.PacketSize := 1024;
Pkt.Flag := 1;
Pkt.PacketNo := PktNo;
Inc(PktNo);
m.Read(Pkt.Data,1024);
SendPkt(Pkt);
end
else
begin
Pkt.PacketSize := m.size-m.position;
Pkt.Flag := 0;
Pkt.PacketNo := PktNo;
Inc(PktNo);
m.Read(Pkt.Data,m.size-m.position);
SendPkt(Pkt);
end;
end;
 
我是否能借光?
 
各位还有什麽别的看法!
 
danceofwind:
那把图形Stream类型转换成Clipboard应该怎样写?
 
直接用TClipboard的Assign方法,
比如,一MemoryStream中存有一BMP,
代码如下:
bm:TBitMap;
m:TMemoryStream;
.
.
.
bm := TBitMap.Create;
m.position := 0;
bm.LoadFromStream(m);
ClipBoard.Assign(bm);
bm.Free;
.
.
.
这样,这个BMP就拷贝到剪贴板上了。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
560
import
I
后退
顶部