socket如何传图片
使用socket传递文字已经没有问题,但是试图传图片的时候发现server端有sendstream,但是client端没有receivestream,只有receivebuf。但是如果使用receivebuf会发现,传过去的东西和接收到的东西是不一样的,导致无法还原成图片。
请问这个问题是怎么解决的?
[解决办法]
socket没用过
DATASNAP很简单
[解决办法]
就是用Receivebuf,来接收数据图片数据,发送图片之前,应该发送此图片的大小,格式之类的。此信息应用结构体,且最好使用Ansci字符。发送此结构体,请使用SendBuf,然后再用SendStream发送图片。接收时,先接收此结构体,以获取图片信息,再循环接收字节数据,用WriteFile,或 TMemoryStream 来保存接收到的字节数。接收等于图片大小时,就进行下次监听。
流程如下:
客户端:发送图片结构体-发送图片。
服务器:接收图片结构体-获取图片字节数-循环接收图片,直到接收到的总字节数=图片大小。
图片结构体如下所示:
type
TFileInfo = record
dwFileSize: DWORD; //图片大小(节字)
szFileName: array [0..255] of AnsiChar; //文件名
end;
[解决办法]
用流进行传输
[解决办法]
socket发送文字与图片有什么区别吗 不都是字节流吗。buf:array of byte.
你接收的发送不一样,只能是转换错了
[解决办法]
不需要转换了,通信的传输是单位是字节(Byte),将用WriteFile 或 TMemoryStream中的WirteBuffer 直接写入即可。如下所示:
var
Buff: array [0..1023] of Byte; //缓冲区
ms: TMemoryStream; //内存流
iRcv: integer; //接收到的数据长度
begin
ms := TMemoryStream.Create;
ZeroMemory(@Buff, 1024); //初始化缓冲区
try
while (...) do
begin
iRcv := recv(.....);
ms.WriteBuff(Buff, iRcv);
end
ms.SaveToFile('test.txt');
finally
ms.free
end;
end