聊天室中,如何把sever端要傳出去的訊息,轉換成unicode格式傳送出去[續]... |
答題得分者是:RaynorPao
|
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
大大:
今天用此方式測試了一下,又發現了一個奇怪的問題,如果傳送的是一串英文或數字的字串,只會傳送第一個字元。如果是中文字就沒關係。
以下是我的程式碼,能否幫我看看,感激不盡~ void __fastcall TForm1::Button2Click(TObject *Sender)
{
mode=1;
AnsiString sz=Edit4->Text;
int iwLen=0;
wchar_t wsz[512]={0};
MultiByteToWideChar(CP_ACP, 0, sz.c_str(), -1, wsz, 512);
iwLen=(wcslen(wsz) 1)*2;
ServerSocket1->Socket->Connections[j]->SendBuf(wsz, iwLen);
Edit4->Clear();
}
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 大大: 今天用此方式測試了一下,又發現了一個奇怪的問題,如果傳送的是一串英文或數字的字串,只會傳送第一個字元。如果是中文字就沒關係。 以下是我的程式碼,能否幫我看看,感激不盡~ void __fastcall TForm1::Button2Click(TObject *Sender) { mode=1; AnsiString sz=Edit4->Text; int iwLen=0; wchar_t wsz[512]={0}; MultiByteToWideChar(CP_ACP, 0, sz.c_str(), -1, wsz, 512); iwLen=(wcslen(wsz) 1)*2; ServerSocket1->Socket->Connections[j]->SendBuf(wsz, iwLen); Edit4->Clear(); }leeli 你好: 請問~~你的 client 端是怎麼寫的?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
Dear:
最近剛好出差所以沒有回應你的問題。
我使用的client的程式兩個都是別人寫的,其中一個我不知道對方的原始碼,另一個列舉如下: void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Edit3->Text=Socket->ReceiveText(); 兩個程式接到我的訊息所顯現出來的文字都一樣。
請幫我看看問題,感激不盡。
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: Dear: 最近剛好出差所以沒有回應你的問題。 我使用的client的程式兩個都是別人寫的,其中一個我不知道對方的原始碼,另一個列舉如下: void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { Edit3->Text=Socket->ReceiveText(); 兩個程式接到我的訊息所顯現出來的文字都一樣。 請幫我看看問題,感激不盡。leeli 你好: 先試著把 Server/Client 端的程式碼,分別改成以下這樣子看看 < class="code"> // Server #define IDENTIFY_STRING "abcd\0" typedef struct _SEND_STRUCT { wchar_t wszIden[10]; wchar_t wszText[1024]; } SEND_STRUCT, *PSEND_STRUCT; //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { SEND_STRUCT ss; ZeroMemory(&ss, sizeof(SEND_STRUCT)); AnsiString szIden=IDENTIFY_STRING; AnsiString szText="測試傳送字串abcdefg"; MultiByteToWideChar(CP_ACP, 0, szIden.c_str(), -1, ss.wszIden, 10); MultiByteToWideChar(CP_ACP, 0, szText.c_str(), -1, ss.wszText, 1024); ServerSocket1->Socket->Connections[0]->SendBuf(&ss, sizeof(SEND_STRUCT)); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ServerSocket1->Port=4000; ServerSocket1->Open(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { ServerSocket1->Close(); } // Client #define IDENTIFY_STRING "abcd\0" typedef struct _SEND_STRUCT { wchar_t wszIden[10]; wchar_t wszText[1024]; } SEND_STRUCT, *PSEND_STRUCT; //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { SEND_STRUCT ss; Socket->ReceiveBuf(&ss, sizeof(SEND_STRUCT)); char szIden[10]={0}; WideCharToMultiByte(CP_ACP, 0, ss.wszIden, -1, szIden, 10, NULL, NULL); if(!strcmp(IDENTIFY_STRING, szIden)) { char szText[1024]={0}; WideCharToMultiByte(CP_ACP, 0, ss.wszText, -1, szText, 1024, NULL, NULL); ShowMessage((AnsiString)szText); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ClientSocket1->Address="192.168.1.1"; ClientSocket1->Port=4000; ClientSocket1->Open(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { ClientSocket1->Close(); }-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: Dear: 現在client收到的都是"a" 我並沒有改變client的程式,因為我只是要server把字串轉成unicode格事後傳送出去就可以了。而client不用去理會對方傳什麼過來,只需要把對方傳送過來的字串顯示出來就可以了。 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! leeli 你好: (1)client 端收到 "a" 代表 Unicode 字串已經傳過去了 (2)有注意到我上面定義的 structure 嗎?? 實際上在傳輸過程之前的字串會像 這樣子 "abcd\0測試傳送字串abcdefg\0" (3)其中前面 5 個 bytes ("abcd\0")是用來做 identify 的,之後的字串才是 要傳輸的字串內容 (4)但是因為要轉成 Unicode,所以整個資料結構都會變得不一樣了(因為英文字 ANSI 只佔 1 byte,轉成 Unicode 以後變成佔 2 byte),所以原來的字串 "abcd\0" 的 ANSI 串流為以下這樣子(16 進位) 61 62 63 64 00 被轉成 Unicode 以後的串流為以下這樣子(16 進位) 61 00 62 00 64 00 64 00 00 00 (5)所以在你的 Client 端如果用 char* 或 AnsiString 去接這個串流的話,當 然只能看到第 1 個 byte 0x61,因為第 2 個 byte 就是 0x00,就直接截掉 了(這是 NULL terminated string 的特性) (6)如果你的 Client 端不配合更改的話,那就在傳送之前先不要轉成 Unicode 等傳送完成以後,在 Client 端自行轉成 Unicode,這樣問題會簡單許多 (7)如果你還不太了解我在說什麼的話,請參考以下程式碼在 Server 端執行以 後會產生兩個檔案 ms1.dat, ms2.dat,用 UltraEdit 把這兩個檔案打開, 好好觀察這兩個檔案的內容,ms1.dat 是 ANSI 的格式,ms2.dat 是Unicode 的格式,看完以後,你大概就會知道我在說什麼了 void __fastcall TForm1::Button1Click(TObject *Sender) { SEND_STRUCT ss; ZeroMemory(&ss, sizeof(SEND_STRUCT)); AnsiString szIden=IDENTIFY_STRING; AnsiString szText="測試傳送字串abcdefg"; TMemoryStream *ms1=new TMemoryStream; BYTE bSend[5 512]={0}; CopyMemory(bSend, szIden.c_str(), szIden.Length() 1); CopyMemory(bSend szIden.Length() 1, szText.c_str(), szText.Length() 1); ms1->Size=5 512; ms1->Write(bSend, ms1->Size); ms1->SaveToFile("ms1.dat"); delete ms1; MultiByteToWideChar(CP_ACP, 0, szIden.c_str(), -1, ss.wszIden, 5*2); MultiByteToWideChar(CP_ACP, 0, szText.c_str(), -1, ss.wszText, 512*2); TMemoryStream *ms2=new TMemoryStream; ms2->Size=sizeof(SEND_STRUCT); ms2->Write(&ss, ms2->Size); ms2->SaveToFile("ms2.dat"); delete ms2; // ServerSocket1->Socket->Connections[0]->SendBuf(&ss, sizeof(SEND_STRUCT)); }-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
Dear: (1) 我這程式並不是真的要做聊天室的功能。是為了去跟一個硬體溝通。只是因為,那個硬體是走TCP/IP把資訊定期回傳,所以我才會用這種方式來撰寫。並且,我這邊也一樣可以傳命令給硬體,不過因為硬體只接受unicode格式的命令,所以才會衍生出這個問題。
(2) 經過大大的指點,目前問題應該是快解決了。不過,如果我要傳出去的訊息要把前面那個"abcde/o"去掉,是不是指要把#define IDENTIFY_STRING "abcd\0"改為: #define IDENTIFY_STRING ""
??? 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: Dear: (1) 我這程式並不是真的要做聊天室的功能。是為了去跟一個硬體溝通。只是因為,那個硬體是走TCP/IP把資訊定期回傳,所以我才會用這種方式來撰寫。並且,我這邊也一樣可以傳命令給硬體,不過因為硬體只接受unicode格式的命令,所以才會衍生出這個問題。 (2) 經過大大的指點,目前問題應該是快解決了。不過,如果我要傳出去的訊息要把前面那個"abcde/o"去掉,是不是指要把#define IDENTIFY_STRING "abcd\0"改為: #define IDENTIFY_STRING "" ??? 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!leeli 你好: 改成這樣子應該就可以了吧(建議你自己再試試) < class="code"> // Server void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString szText="測試傳送字串abcdefg"; wchar_t wszText[512]={0}; MultiByteToWideChar(CP_ACP, 0, szText.c_str(), -1, wszText, 512*2); ServerSocket1->Socket->Connections[0]->SendBuf(wszText, 512*2); } -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: Dear: 如果我要傳送的訊息是不限長度,然後結尾需要以0x02當截止位元時,是否這樣寫就可以呢? : <>>> >>>>>< face="Verdana, Arial, Helvetica">leeli 你好: (1)麻煩下次有問題一次說完,謝謝你的配合 ( > #> >>>>>>>>> --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |