如何区分socket收到的流是消息还是文件? ( 积分: 50 )

  • 主题发起人 主题发起人 秦野明
  • 开始时间 开始时间

秦野明

Unregistered / Unconfirmed
GUEST, unregistred user!
我要通过socket发送消息,也可能通过socket发送文件,都是以MemoryStream形式发送的,到对方机器上以后有什么办法能够辨认出这些应该是字符型的消息还是文件流?
如果能在流前面打上标识,如何打呢?

我现在是用自己定义的一个记录来发送,前面的StreamType表明流的类型,例如是字符流,文件流,根据这个StreamType做不同的处理。但是不成功
TReceiveStream=record
StreamType:string[100];
sFileStream:TMomeryStream;
end;

发送的时候
procedure TForm1.Button4Click(Sender: TObject);
var
SendStream:TReceiveStream;
XMLList:TStringList;
begin
SendStream.StreamType:='xml';

XMLList……创建并赋值StringList的过程

SendStream.sFileStream:=TMomeryStream.Create;
XMLList.SaveToStream( SendStream.sFileStream);
IdUDPClient1.Host:=RemoHostIP.Text;
IdUDPClient1.Port:=strtoint(Edit_FilePort.Text);
IdUDPClient1.Active:=true;
IdUDPClient1.SendBuffer(TempStream,sizeof(TempStream));
end;

接受的时候
procedure TForm_FaxServer.IdUDPServer1UDPRead(Sender: TObject;
AData: TStream; ABinding: TIdSocketHandle);
var
ReceiveStream :TReceiveStream;
XMLFile:TStringList;
StreamLength:integer;
begin
ReceiveStream.sFileStream:=TMomeryStream.Create;
StreamLength:=AData.Size;
AData.ReadBuffer(ReceiveStream,AData.Size);
showmessage(ReceiveStream.StreamType);
ReceiveStream.FileStream.Position:=0;(这里出错)
XMLFile.LoadFromStream(ReceiveStream.sFileStream);(如果上句去掉这里就出错)
end;

可以正常显示ReceiveStream.StreamType这个值,但是不能访问ReceiveStream.sFileStream这个值,是不是我这样定义记录是不对的,还是我取流的方法有错呢?或者是给流打上标识的方法不应该用记录的方式呢?
 
我要通过socket发送消息,也可能通过socket发送文件,都是以MemoryStream形式发送的,到对方机器上以后有什么办法能够辨认出这些应该是字符型的消息还是文件流?
如果能在流前面打上标识,如何打呢?

我现在是用自己定义的一个记录来发送,前面的StreamType表明流的类型,例如是字符流,文件流,根据这个StreamType做不同的处理。但是不成功
TReceiveStream=record
StreamType:string[100];
sFileStream:TMomeryStream;
end;

发送的时候
procedure TForm1.Button4Click(Sender: TObject);
var
SendStream:TReceiveStream;
XMLList:TStringList;
begin
SendStream.StreamType:='xml';

XMLList……创建并赋值StringList的过程

SendStream.sFileStream:=TMomeryStream.Create;
XMLList.SaveToStream( SendStream.sFileStream);
IdUDPClient1.Host:=RemoHostIP.Text;
IdUDPClient1.Port:=strtoint(Edit_FilePort.Text);
IdUDPClient1.Active:=true;
IdUDPClient1.SendBuffer(TempStream,sizeof(TempStream));
end;

接受的时候
procedure TForm_FaxServer.IdUDPServer1UDPRead(Sender: TObject;
AData: TStream; ABinding: TIdSocketHandle);
var
ReceiveStream :TReceiveStream;
XMLFile:TStringList;
StreamLength:integer;
begin
ReceiveStream.sFileStream:=TMomeryStream.Create;
StreamLength:=AData.Size;
AData.ReadBuffer(ReceiveStream,AData.Size);
showmessage(ReceiveStream.StreamType);
ReceiveStream.FileStream.Position:=0;(这里出错)
XMLFile.LoadFromStream(ReceiveStream.sFileStream);(如果上句去掉这里就出错)
end;

可以正常显示ReceiveStream.StreamType这个值,但是不能访问ReceiveStream.sFileStream这个值,是不是我这样定义记录是不对的,还是我取流的方法有错呢?或者是给流打上标识的方法不应该用记录的方式呢?
 
自定义协议了来保证对方知道你传输的具体内容。
 
是啊,自己定义,都用流的方式,流的前几个固定字节作为区别标识符,后面作为接收内容。
 
如何在流前面添加自定义的字符呢?小弟是新手,望各位指导一下
 
而且,我发送这个记录型的数据应该是可以的啊,为什么就是读不出来呢?
 
1. UDP 发大块头不可靠;
2. 协议;
3. 发和收的都是流;所以要自己转换为结构;
 
不能判断,tcp发送的单位是字节流。
需要自己制定协议。
 
这个要自己写协议的
不会帮你分清的
 
接受答案了
 
后退
顶部