none
自己從 C# 轉 VB 的 TCP_Client 程式,轉完後接收功能有點問題 RRS feed

  • 問題

  • 在網路上找到 TCP Client/Server 程式,不過是 C# 版本,
    網路找到的範例下載點:
    http://files.dotblogs.com.tw/billchung/0905/2009522235314213.rar

    自己嘗試先將 Client 端轉換成 VB 2008 板本,轉換完成後發送功能OK,
    但接收功能接收 Server 端訊息時,TextBox 只顯示類似「 空字串 + vbCr 」的資料,沒有顯示 Server 端傳來的字串。

    下方是自己轉換後的程式碼,與來源程式唯一不同的地方是Byte陣列宣告那邊,
    因為不曉得怎麼修改,初始化陣列沒有指定大小,
    所以 BeginReceive 中的參數的 size大小那裡用Byte.Length替代。

    Imports System.Text
    Imports System.Net
    Imports System.Net.Sockets
    
    Public Class Form1
    
        Public Delegate Sub SetMsg1Callback(ByVal strReceive As String)
        Private Sub DisplayMsg1(ByVal strReceive As String)
            If TextBox3.InvokeRequired Then
                Dim d As SetMsg1Callback = New SetMsg1Callback(AddressOf DisplayMsg1)
                Invoke(d, New Object() {strReceive})
            Else
                TextBox3.Text += strReceive
                TextBox3.Text += Environment.NewLine
            End If
        End Sub
    
    
        Private MySocket As Socket
        Private ServerIP As String
        Private ServerPort As Integer
        Private MyEndPoint As IPEndPoint
        Private RemoteEndPoint As IPEndPoint
        Private myReceiveBytes() As Byte
    
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            MyEndPoint = New IPEndPoint(IPAddress.Any, 0)
            ServerIP = TextBox1.Text
            ServerPort = System.Convert.ToInt32(TextBox2.Text)
            RemoteEndPoint = New IPEndPoint(IPAddress.Parse(ServerIP), ServerPort)
            MySocket = New Socket(MyEndPoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
            MySocket.Connect(RemoteEndPoint)
            MySocket.BeginReceive(myReceiveBytes, 0, myReceiveBytes.Length, 0, New AsyncCallback(AddressOf ReceiveHandler), MySocket)
        End Sub
    
        Private Sub ReceiveHandler(ByVal pIAsyncResult As IAsyncResult)
    
            Dim InBytes As Integer
            InBytes = MySocket.EndReceive(pIAsyncResult)
            If InBytes > 0 Then
                Dim myString As String = ""
                myString = Encoding.GetEncoding(950).GetString(myReceiveBytes)
                myString = myString.TrimEnd()
                DisplayMsg1(myString)
            End If
            MySocket.BeginReceive(myReceiveBytes, 0, myReceiveBytes.Length, 0, New AsyncCallback(AddressOf ReceiveHandler), MySocket)
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim mySendBytes As Byte()
            mySendBytes = Encoding.GetEncoding(950).GetBytes(TextBox4.Text)
            MySocket.BeginSend(mySendBytes, 0, mySendBytes.Length, 0, New AsyncCallback(AddressOf SendHandler), MySocket)
    
        End Sub
    
        Private Sub SendHandler(ByVal pIAsyncResult As IAsyncResult)
            Dim OutBytes As Integer
            OutBytes = MySocket.EndSend(pIAsyncResult)
        End Sub
    
    End Class


    • 已編輯 C.Kevin 2012年7月11日 上午 03:56
    2012年7月11日 上午 03:52

解答

  • Private myReceiveBytes() As Byte <-- 這邊給它個初始大小, 比方改成

    Private myReceiveBytes(8191) As Byte 這樣就好了.

    因為你不給初始大小, 它沒辦法存取的.

    話說你去哪個網頁看到這範例, 我自己都忘記有寫過這玩意.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 C.Kevin 2012年7月11日 上午 05:31
    2012年7月11日 上午 04:02
    版主

所有回覆

  • Private myReceiveBytes() As Byte <-- 這邊給它個初始大小, 比方改成

    Private myReceiveBytes(8191) As Byte 這樣就好了.

    因為你不給初始大小, 它沒辦法存取的.

    話說你去哪個網頁看到這範例, 我自己都忘記有寫過這玩意.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 C.Kevin 2012年7月11日 上午 05:31
    2012年7月11日 上午 04:02
    版主
  • 謝謝 Bill ~~

    在奇摩知識+ 找到的,本來也想到您網頁找看看有沒有這程式的網頁,沒找到。
    http://tw.knowledge.yahoo.com/question/question?qid=1509052502329

    2012年7月11日 上午 05:33
  • 喔, 哈哈, 我自己忘了.

    如果是用 TcpClient 和 TcpListener 來做的, 我倒是有寫過一篇使用 VB 的, 你可以參考一下, 某些道理相通.

    實作同步 .NET Socket TCP《使用TcpClient與TcpListener類別》


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月11日 上午 05:40
    版主
  • ㄏ~ ~

    Bill 謝謝。 

    2012年7月11日 上午 06:46