WinSocket中連續SendText的問題 |
缺席
|
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
請教問題如下~
在WinSocket連續使用SendText,接收端會收到一個所有字串相加的字串。例如:
TClientSocket1.Socket.SendText('test1');
TClientSocket1.Socket.SendText('test2');
TClientSocket1.Socket.SendText('test3'); 接收端收到的字串是'test1test2test3',而不是分開來了三個字串… 有沒有辦法在每次SendText後真正將字串送出,而不是寫到緩衝區裡一次送出?
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
|
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
00156 你好:
TClientSocket1.Connect
是告知對方準備接收前的確認,這是必須的特別是
引言: 我的連線對象一直在更改,....TClientSocket1.Disconnect 是告知對方不要在接收的確認,所以當你還在連線時資料會一直送,而非寫在 緩衝區一起送!! 關於 引言: 簡化程序及提升效率,...可以將 function(sendMessages:STRING):BOOLEAN; begin TClientSocket1.Connect; TClientSocket1.Socket.SendText(sendMessages); TClientSocket1.Disconnect; end; 連在一起寫成function
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
ko 您好: 我的目的是要傳輸一個檔案,先傳檔案資訊,再傳檔案內容:
TClientSocket.Open; TClientSocket.Socket.SendText('filename=' filename); TClientSocket.Socket.SendText('filesize=' IntToStr(filesize)); TClientSocket.Socket.SendStream(AStream); TClientSocket.Close;結果綠色的三行資料會全部合併在一起傳遞(緩衝區4K以內的資料),接收端就沒辦法分開檔案名稱、大小與內容了。 我目前在網站上找到的方法是 TClientSocket.Open; TClientSocket.Socket.SendText('filename=' filename); sleep(1000); TClientSocket.Socket.SendText('filesize=' IntToStr(filesize)); sleep(1000); TClientSocket.Socket.SendStream(AStream); TClientSocket.Close;...利用延遲來分開傳遞,但是總不夠確定。 我還是希望避免寫成: TClientSocket.Open; TClientSocket.Socket.SendText('filename=' filename); TClientSocket.Close; TClientSocket.Open; TClientSocket.Socket.SendText('filesize=' IntToStr(filesize)); TClientSocket.Close; TClientSocket.Open; TClientSocket.Socket.SendStream(AStream); TClientSocket.Close; |
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
00156 你好:
引言: 你的目的是要傳輸一個檔案,先傳檔案資訊,再傳檔案內容那就要用一問一答,就是說當 TClientSocket.Socket.SendText('filename=' filename); server要回傳某個資訊在傳 TClientSocket.Socket.SendText('filesize=' IntToStr(filesize)); server要回傳某個資訊在傳 TClientSocket.Socket.SendStream(AStream); 如下(出自本站的傳檔範例): 引言: //server部分 procedure TForm1.TCPServerExecute(AThread: TIdPeerThread); var SRequest: string; begin with AThread.Connection do begin AThread.Synchronize(IncrConnectionCount); WriteLn('Welcome to Auto Update Server'); try SRequest := UpperCase(ReadLn); //傳送檔案 if SRequest = 'GETFILE' then //傳檔需求 begin WriteLn('FILENAME?'); //尋問要取那一個檔 SRequest := UpperCase(ReadLn); SendFile(AThread, SRequest);//這裡是將一個檔案變成Stream end; finally Disconnect; AThread.Synchronize(DecrConnectionCount); end; end; end; 引言: //client部分 function TForm1.GetFiles(SaveFilePath: string; iFileName: Tstrings): boolean; var FStream: TFileStream; i:integer; SResponse: string; begin try TCPClient.Connect(); while TCPClient.Connected do begin SResponse := UpperCase(TCPClient.ReadLn); //讀取伺服器回應 if Pos('WELCOME', SResponse) = 0 then break; //若無回應則離開 TCPClient.WriteLn('GETFILE'); SResponse := UpperCase(TCPClient.ReadLn); //讀取伺服器回應 for i:=0 to iFileName.Count-1 do begin TCPClient.WriteLn(iFileName.Strings[i]); try FStream := TFileStream.Create(SaveFilePath '\' iFileName.Strings[i], fmCreate); FStream.Seek(0, soFromBeginning); TCPClient.ReadStream(FStream, -1, True); finally FStream.Free; end; end; end; finally TCPClient.Disconnect; end; end;
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |