SCANLINE怎么用?(50分)

我是说多少字节
 
大概几百K,但要同时发给几十台机器
 
那不大呀,直接用TCP传过去就可以了。
 
这是屏幕广播的,100MS刷一次,同时传给几十台机
直接传不是要命吗
 
如果是TCP,没有广播这一说。你用的是UDP?

或者你可以传一个[1..Image1.Picture.Width, 1..Image1.Picture.Width]的二维数组
过去,也比一行一行地传方便。
 
数组里放不同点?那不是慢很多吗?
 
Client:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
client.Socket.SendText('cap');
end;
------------------
Server:
if socket.ReceiveLength =3 then
begin
showmessage('ggg');
end;

我按一次BUTTON1,SERVER回弹出MSGBOX,为什么我再按BUTTON1,就没动作了?
是不是要做什么清空工作?
 
对你要把它读出来。Socket.ReceiveBuf()
 
先读,再判断LENGTH?
 
你ReceiveBuf实际上就把缓冲区清空了。
 
不太明白~~~

照你说的,那我该怎么写上面的那段?
 
你用的是什么?我一般用Socket API,对控件不熟。
 
TCLIENTSOCKET和TSERVERSOCKET
 
buf: array[0..1023]of char;

if socket.ReceiveLength > 0 then Socket.ReceiveBuf(buf, ReceiveLength)
 
我的接收部分应当没有问题:
if Socket.ReceiveLength>=Image1.Width+SizeOf(Integer) then
是判断当前socket缓冲区中的未读出的字节数, 如果这个数值<一行的字节数则不读socket而将它留在系统缓冲区里。 知道这个数值超过一行的长度。
下面用receivebuf接受一行的数据同时将缓冲区中已读出的清除(可能这时缓冲区里还保留有下面一行的数据未读出呢)

发送部分也没有什么问题呀。
我看下来出现问题的可能是server端的Image2的宽度和client端的Image1的宽度不同!
(server端的图片小,而且你server端的图片只有一行数据不同), 这样client端就不会执行下去了(因为接受不到足够一行的数据).
 
一样一样~,宽度一样,每行数据都不一样~(一个全兰色,一个全黑色);
 
哈啊哈哈哈哈 !!!成了!!!!!!!!

但就是还有个问题,我的两幅图都是24位的bmp,可传过来时CLIENT的IMAGE1只变化了1/3
我事先设置过PF24BIT了呀
如果换成PF8BIT,到是可以把全部想素传过来,可中间有一块好象发生了扭曲~(上下拉伸)

这是怎么回事?
 
而且一旦象素一多(比如2副屏幕接图(16bit)),CLIENT的IMAGE1显示的就好象不是SERVER传来的象素
 
如果是24bit的话发送和接受的数据量都*3即可
server 端:
for i := 0 to Image1.Picture.Height-1 do
begin
l1 := Image1.Picture.Bitmap.ScanLine;
l2 := Image2.Picture.Bitmap.ScanLine;
if not comparemem(l1, l2, Image1.Width*3) then // 比较image1和image2每一行, 如果是24bit则*3, 15,16bit则*2, 8bit*1
begin
socket.SendBuf(i, Sizeof(Integer)); // 发送行号
socket.SendBuf(l2^,Image1.Width); // 发送Image2的整行数据
end;
end;


Client端:
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var l1,l2:pByteArray;
n: Integer;
begin
if Socket.ReceiveLength>=Image1.Width*3+SizeOf(Integer) then //接受到完整一行数据 24bit*3, 15-16bit*2, 8bit*1
begin
GetMem(l2, Image1.Width); // 分配接受缓冲区
Socket.ReceiveBuf(n, SizeOf(Integer)); // 接受行号
Socket.ReceiveBuf(l2^, Image1.Width); // 接受一行数据
l1 := Image1.picture.Bitmap.Scanline[n]; // 确定修改的是哪一行
move(l2^, l1^, Image1.Width*3); // 将整行数据替换成server端的数据
FreeMem(l2); // 释放缓冲区
end;
end;
 
我用的不是你的代码~~你的还是不行~~~

*3后IMAGE1虽然全被填充了~,但好象填充的全是SERVER IMAGE2的前几行象素~
 

Similar threads

回复
0
查看
577
不得闲
回复
0
查看
574
不得闲
回复
0
查看
665
不得闲
S
回复
0
查看
664
swish
S
顶部