如何判断socket接收的数据是字符串还是流?(50分)

  • 主题发起人 主题发起人 zhous123456
  • 开始时间 开始时间
Z

zhous123456

Unregistered / Unconfirmed
GUEST, unregistred user!
在使用clientSocket编程时有时使用sendtxt有时使用sendstream,server该怎么接收?
 
要和客户端定义好协议,
先发送一个握手信号。
根据握手信号来确定发送的是str或stream
 
其实不管用SendTxt还是用SendStream,底层处理都是一样的,接受也都是一样的,只不过SendTxt是每两个Byte标示一个Txt,而Stream本身就是以Byte形式存在的,所有接收时如果是SendTxt发来的数据需要每两个Byte转换成一个Txt,而Stream则直接将接收到的Byte写到Stream中。
所以,很多协议都定义了Header(头)和Body(实体),头是固定大小的,用来告诉接收者数据的格式、用途、长度等信息,接收者根据Header来接受Body。
 
谢谢两位大侠,我现在在编传送多个小文件的程序,有时传文件有时传字符串,我该怎样去做?有没有类似的源程序?急!非常感谢!
 
那你就可以定义一组协议,比如Header占4Bytes,第一个Byte标值是文件还是流,第二个Byte保留,第三四个Byte标志Body的长度,那么每次你都用ReadStream先读到4个Byte,根据这4个Byte再读后面的Body(文件或字符串)。这样,以后协议还可以扩展。
 
以下只是发送文件的代码,我想加一段程序,再发送完文件后再把文件名、客户端ID等数据也发过去,该怎样修改,十分感谢!

//这是服务器端
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
MyBuffer: array[0..1000] of byte; {设置接收缓冲区}
MyReceviceLength: integer;
MyBmp: TBitmap;
begin

MyReceviceLength := socket.ReceiveLength; {读出包长度}
Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}

MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}
MyStream.Position := 0;
MyBmp := tbitmap.Create;
try
Mybmp.LoadFromStream(MyStream); {将流中的数据读至图像对象中}
Mybmp.SaveToFile(GetCurrentDir+'/'+R_ip+'.bmp');
Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }
finally {以下为清除工作 }
MyBmp.free;
MyStream.Clear;
end;

end;


//这是客户端
procedure TForm1.Button2Click(Sender: TObject);
var
MyBmp: TBitmap;
begin
try
MyStream := TMemorystream.Create;{建立内存流}
MyBmp := TBitmap.Create;
MyBmp.LoadFromFile(edit2.text); {True表示抓鼠标图像}
Mybmp.SaveToStream(MyStream); {将JPG图象写入流中}
MyStream.Position := 0;{注意:必须添加此句}
finally
MyBmp.free;
end;
ClientSocket1.Socket.SendStream(MyStream); {将流发送出去}
// MyStream.Clear;
end;
 
多人接受答案了。
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部