2010-07-17 120 views
1

我試圖使用服務器和客戶端套接字將圖片從'C:\ picture.bmp'發送到'c:\ temp \ picture.bmp' 客戶端onconnect事件處理程序如下:從客戶端發送圖片到服務器的問題

procedure TForm2.ClientSocket1Connect(Sender: TObject; 
    Socket: TCustomWinSocket); 
var 
    fs : tfilestream; 
    begin 
    fs := TFileStream.create('C:\picture.bmp', fmOpenRead);//picture allready exists 
    socket.SendStream(fs); 
    fs.free;    
end; 

和服務器onclientread爲:

procedure TForm2.ServerSocket1ClientRead(Sender: TObject; 
    Socket: TCustomWinSocket); 
var 
    fmm : tfilestream; 
    iLen: Integer; 
    Bfr: Pointer; 
    begin 

    iLen := Socket.ReceiveLength; 
    GetMem(Bfr, iLen); 
    fmm := TFileStream.Create('c:\temp\picture.bmp', fmCreate or 

fmShareDenyWrite); 
    try 
    Socket.ReceiveBuf(Bfr^, iLen); 
    fmm.Write(Bfr^, iLen); 
    finally 
    FreeMem(Bfr); 
    fmm.Free; 
    end; 

end; 

圖片收到/創建的,但要麼是腐敗上是從來沒有收到因爲tfilestream.create方法創作的IE瀏覽器? 請幫助!我做錯了什麼?

回答

1

儘管它的名字,SendStream()不保證發送整個流(尤其是如果您使用的是非阻塞套接字)。它的返回值返回實際發送的字節數。如果在一次調用中發送小於整個流的大小,則必須再次調用SendStream()(可能多次)以完成發送整個流(SendText()也存在同樣的問題)。

另一方面,ReceiveLength()只報告套接字AT THAT MOMENT上有多少字節可用。這可能比發送的完整流少(同樣,ReceiveText()可能因爲它在內部使用ReceiveLength()而無法接收完整發送的字符串)。

發送流(或任何一般的任意數據)的最佳方式是首先發送數據的大小,然後發送實際數據。繼續調用SendBuf/Stream/Text()直到達到該大小(如果-1由非阻塞套接字返回而不引發異常,則必須等待套接字的OnWrite事件觸發,之後套接字才能再次接收更多數據)。在接收端,首先讀取大小,然後繼續讀取,直到達到指定的大小。在獲取所有數據之前,您可能必須讀取多次OnRead事件觸發。

轉到http://www.deja.comhttp://forums.embarcadero.com搜索Borland/CodeGear/Embarcadero新聞組/論壇檔案。我之前多次發佈過示例代碼。

+0

例如https://forums.embarcadero.com/message.jspa ?messageID = 234664和https://forums.embarcadero.com/message.jspa?messageID=255358 - jeroen – 2010-07-17 20:20:03

+0

感謝您的答案,我不知道更多的非套接字更好的非阻塞或阻塞?我仍然無法發送它可以指向除jeroen pluimers之外的其他示例,還是可以請修改我的代碼以使其工作?你是什​​麼意思通過sendstream一次又一次,不會從發送流開始我的意思是我無法找到像socket.sendstream中的data.position(我們可以設置爲當前位置)的任何參數....請幫助! – 2010-07-18 12:27:13

+0

''它的返回值返回實際發送的字節數''sendstream返回發送了多少字節?是不是它只返回布爾值,即發送流後真/假? – 2010-07-18 17:15:06

1

我不知道什麼是錯,但我會嘗試解決一個更簡單的問題。你甚至可以轉移一些簡單的東西嗎?看看你是否可以轉移只包含「你好」的c:\ hello.txt,並讓它以正確的順序到達。檢查流和結果文件應該更容易,以查看事情是否出現亂碼。如果您在服務器上沒有收到「Hello」,那麼您知道這與數據的大小或複雜性無關。

+0

感謝您的答案,是的,我可以傳輸文本文件,jpeg的給我proplems請幫助! – 2010-07-18 12:28:42

+0

雖然我發送的文本文件很小 – 2010-07-18 17:24:14

+0

也許嘗試一些大型的模式,所以你可以看到是否有任何差距,轉位等... – 2010-07-18 20:36:25

相關問題