none
關於sock 用戶端接受伺服器端的訊息 中文變成問號的問題 RRS feed

  • 問題

  • 關於sock 用戶端接受伺服器端的訊息 中文變成問號的問題

    又有問題來麻煩各位前輩了

    伺服器端程式是 VB2005 開發的 ,使用System.Net.Sockets

    客戶端是VB6 ,用Winsock

    從伺服器端傳送的是中文時,客戶端收到的卻是一堆問號。

    伺服器端傳送的程式碼如下

     Dim byteData As Byte() = Encoding.ASCII.GetBytes(data)

     ' Begin sending the data to the remote device.
    handler.BeginSend(byteData, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallback), handler)

    我發現這裡 傳送的是bytedata 是要轉成GetBytes格式

    我試過要直接用字串傳,但是不行

    請問,有什麼辦法 可以在客戶端vb6程式 將收到的位元組陣類轉為文字。
    或者直接以字串傳送

    因為客戶端vb6的程式 還希望相容於舊版本的程式,如果能夠叢伺服器端直接傳送文字就再好不過了。


    謝謝!





    2009年3月10日 下午 12:38

解答

  • 用 AscII 編碼的話,所有超過 128 的都會變 ? 。
    繁中 Windows 可用 Default 編碼,或是 Encoding.GetEncoding("big5").GetBytes(data) 編碼。

    VB6 收到就用
    strGet = StrConv(bytesGet, vbUnicode)
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 chih.ching 2009年3月10日 下午 05:27
    2009年3月10日 下午 01:42

所有回覆

  • 用 AscII 編碼的話,所有超過 128 的都會變 ? 。
    繁中 Windows 可用 Default 編碼,或是 Encoding.GetEncoding("big5").GetBytes(data) 編碼。

    VB6 收到就用
    strGet = StrConv(bytesGet, vbUnicode)
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 chih.ching 2009年3月10日 下午 05:27
    2009年3月10日 下午 01:42
  • 感謝大大, 剛剛問題已經解決。

    再請教

    socket 是否只能是獨立的執行緒。

    我無法正常的顯示表單出來

    即使我去呼叫表單
    表單也是卡在哪裡
    如下程式碼
    While True
                allDone.Reset()
                listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listener)
                allDone.WaitOne()
                ' System.Windows.Forms.Application.DoEvents()
                ' frmPWSmanager.Show()
    End While


    其中 allDone.WaitOne() 傾聽中,會一直在等待
    似乎不像VB6 的 WINSOCK 那樣

    請問 是否 我要顯示表單以及表單的運作必須使用多執行緒才行。



    2009年3月10日 下午 05:32
  • 其實我的程式 本來是用 VB2005 + WINSOCK 來處理,運作也正常
    但是卻無法在 WINDOWS SERVER 2000的作業系統執行
    只要一執行,就會發生 應用程式被關閉然後要回報錯誤給微軟的訊息

    試了很多台電腦都一樣
    我也嘗試 在起始程式中加上很多的訊息,要查看看 到底是跑到那裡才錯誤,但似乎是在表單的LOAD 事件以前就發生錯誤了

    這個程式在XP 跑的很正常,就是不能在SERVER 上面跑

    所以 我才想是不是因為 用了 COM物件的關係
    才來研究用 SOCKETS

    不過概念似乎跟WINDSOCK 差異很大。


    2009年3月10日 下午 05:37
  • socket 本身並非限制一定要多緒,但你是 Server Listen 端,不用多緒的話就別玩了。
    在 VB6 中,winsock 本身也是多緒在跑,只是微軟幫你包起來,讓 VB6 可以輕鬆的處理,不用管多緒的問題,但缺點就是同時只能處理一個事件,在 VBNET 中,你可以自己寫個使用者控制項,讓他多緒去聆聽,透過委派事件讓他在應用程式中會回饋事件來,我自己有寫個這樣的類別,當然它的缺點就跟 winsock 一樣,從即時性來說,這樣比較差,只是比較方便而已。

    至於表單會卡在那,很簡單,你呼叫了 WaitOne ,表示你目前執行緒要進入發呆狀態等該執行緒跑完,不停在那才奇怪。

    執行緒基本上要讓他有自己的運作,不要讓主執行緒去做額外控制,你這部分要寫得好的話,先把線上手冊關於多緒的部分看一看,包含範例跑一跑,範例有三種多緒方式可參考。然後開始看線上手冊內的 socket 範例,裡面有 Server + Client ,跑過後就會比較清楚了。

    VBNET 已經是完整的編譯器了,不是 VB6 那種鱉腳編譯器,但從另一個角度來說,你必須學更多的開發相關知識,不像 VB6 那樣可以不管執行緒問題,而 VB2005 以後又比 VB2003 以前多了執行緒權限設定,很多地方需要委派來跑,你也可以用委派為關鍵字搜尋本版,會找到更多的討論。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年3月10日 下午 11:53
  • 你一開始要呼叫BeginAccept的程序就應該用多執緒去呼叫
    類似像這樣
     ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf StartListen), myStateObject)

    接下來在
    Sub StartListen中寫你的Accept程序
    While True
                allDone.Reset()
                listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listener)
                allDone.WaitOne()
                ' System.Windows.Forms.Application.DoEvents()
                ' frmPWSmanager.Show()
    End While
    然後收到資料後去做Invoke主表單控制項的動作
    關於Invoke,你可以參考以下的文章

    MSDN中有一些參考
    Control.InvokeRequired 屬性
    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.invokerequired(VS.80).aspx

    HOW TO:使用背景執行緒搜尋檔案
    http://msdn.microsoft.com/zh-tw/library/3s8xdz5c(VS.80).aspx

    論壇有一篇討論這個,寫的很清楚
    Thread 與 Static
    http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/09dd6911-2539-403f-8a30-c5f837098b74/
    2009年3月11日 上午 01:15
    版主