全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2061
推到 Plurk!
推到 Facebook!

WinSocket中連續SendText的問題

缺席
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-23 22:46:08 IP:61.56.xxx.xxx 未訂閱
請教問題如下~ 在WinSocket連續使用SendText,接收端會收到一個所有字串相加的字串。例如: TClientSocket1.Socket.SendText('test1'); TClientSocket1.Socket.SendText('test2'); TClientSocket1.Socket.SendText('test3'); 接收端收到的字串是'test1test2test3',而不是分開來了三個字串… 有沒有辦法在每次SendText後真正將字串送出,而不是寫到緩衝區裡一次送出?
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-24 09:29:50 IP:61.221.xxx.xxx 未訂閱
00156 你好: 應該說 在每次 TClientSocket1.Connect 跟在激情過後 TClientSocket1.Disconnect
------
======================
昏睡~
不昏睡~
不由昏睡~
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-24 09:48:33 IP:61.56.xxx.xxx 未訂閱
引言: 00156 你好: 應該說 在每次 TClientSocket1.Connect 跟在激情過後 TClientSocket1.Disconnect
謝謝你。不過我的連線對象一直在更改,為了簡化程序及提升效率,所以希望不一直重複斷線及連線…何況我的資料是連續送出的。有沒有其他方法呢?
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-24 10:49:02 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-24 11:17:45 IP:61.56.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-24 11:47:56 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-24 18:30:09 IP:61.56.xxx.xxx 未訂閱
這種拋球式的方法我也試過了...還是出現原來的問題。目前還是只有延遲的方法才行耶!我再試試看好了!
系統時間:2024-05-02 6:30:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!