none
[求助] Socket問題 for VB2008? RRS feed

  • 問題

  • 問題如下:

    Server傳送Data給Client沒有問題.

    Client傳送Data給Server:

    第一次: Client傳送:1234567890       Server接收:1234567890

    第二次: Client傳送:ABCDEFGHIJK     Server接收:ABCDEFGHIJK

    第三次: Client傳送:ABCDEFGHIJK     Server接收:ABCDEFGHIJ(10 bytes), K(1Byte) (分2次接收)

    第四次: Client傳送:ABCDEFGHIJK     Server接收:A,B,C,...K(1Byte) (分11次接收)

    為什麼Server端會分段接收進來, 而不能一次接收進來? 我要怎麼修改程式?

    謝謝回覆!!

    Server程式如下:

    ------------------------------------------------------------------------------------------------------------------

        Private Sub StartListen()
            intPort = CType(txtPortNo.Text, Integer)
            Try
                'If fAccept = False Then
                mySocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                'End If
                '監測本機的特定Port
                mySocket.Bind(New IPEndPoint(IPAddress.Parse(txtLocalIPAddress.Text), intPort))
                mySocket.Listen(15) '開始監聽
                Call DisplayText("等待Socket用戶端連線中.....")
                fListen = True '已開始監聽
            Catch ex As SocketException
                MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub AcceptConnection()
            Dim bteAcceptData(1024) As Byte
            Dim intAcceptData As Integer
            Try
                While Not fListen
                    Call DisplayText("等待建立監測程序…")
                    TimeDelay(30)
                End While
                myAcceptSocket = mySocket.Accept() '接受連線
                fAccept = True
                '顯示遠端電腦資訊
                Call DisplayText("遠端: " & myAcceptSocket.RemoteEndPoint.ToString)
                '此迴圈不斷接收資料
                Call DisplayText("開始接受用戶端連線,收受連線資料....")
                While (True)
                    If fAccept Then
                        'Call TimeDelay(RX_DATA_TIME)                     <----- 加Delay沒用
                        intAcceptData = myAcceptSocket.Receive(bteAcceptData) '接收資料
                        ReDim Preserve bteAcceptData(intAcceptData - 1)
                        If intAcceptData > 0 Then '判斷是否結束傳輸
                            Call DisplayText("接收了 " + intAcceptData.ToString + " 個位元組的資料 !!")
                            Call Rx_Process(bteAcceptData)
                            'Call Rx_ProcessToControl(bteAcceptData)
                            Array.Clear(bteAcceptData, 0, intAcceptData) '清除陣列內容
                        Else    ' Receive lngAcceptData=0 when client close the socket
                            Call DisplayText("停止接收資料,結束程序")
                            CloseConnection() '關閉程序
                            fListen = False : fAccept = False
                            mySocket.Listen(15) '開始監聽
                            Call DisplayText("等待Socket用戶端連線中.....")
                            fListen = True '已開始監聽
                            TimeDelay(10000)
                            myAcceptSocket = mySocket.Accept() '接受連線
                            fAccept = True
                            Call DisplayText("開始接受用戶端連線,收受連線資料....")
                        End If
                    End If
                End While
            Catch ex As SocketException
                Call DisplayText(ex.Message)
                myAcceptSocket.Close()
            End Try
        End Sub

         Private Sub btnListen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListen.Click
            ListenThread = New Thread(AddressOf StartListen)
            AcceptThread = New Thread(AddressOf AcceptConnection)
            ListenThread.Start()  '監聽
            TimeDelay(10000)
            AcceptThread.Start() '接收
        End Sub

     

    2012年10月22日 上午 08:18

解答

  • Tcp 本來就會分段傳, 論壇已有許多討論緒曾討論這問題.

    請參考 既有討論


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

    2012年10月22日 上午 09:20
    版主
  • 應該是說,你還沒傳完,你就去接收,比如說傳真機傳個 10 頁好了,才傳個一頁就去看,當然沒傳完,但是傳遞並沒有分段。

    分段要討論比較複雜,你先當成沒分段去理解。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月22日 下午 01:17

所有回覆

  • Tcp 本來就會分段傳, 論壇已有許多討論緒曾討論這問題.

    請參考 既有討論


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

    2012年10月22日 上午 09:20
    版主
  • 應該是說,你還沒傳完,你就去接收,比如說傳真機傳個 10 頁好了,才傳個一頁就去看,當然沒傳完,但是傳遞並沒有分段。

    分段要討論比較複雜,你先當成沒分段去理解。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月22日 下午 01:17
  • 謝謝各位大大的回覆!!

    問題已解決, 修改如下:

    移走 : ReDim Preserve bteAcceptData(intAcceptData - 1)

    加入temp_buf :

                        intAcceptData = myAcceptSocket.Receive(bteAcceptData) '接收資料
                        If intAcceptData > 0 Then '判斷是否結束傳輸
                            ReDim temp_buf(intAcceptData - 1)                                         <---- 加入
                            Array.Copy(bteAcceptData, temp_buf, intAcceptData)                <---- 加入

    2012年10月23日 上午 03:34
  • 回隔壁那篇的連結,你也看一看吧~ 架構一樣,程式碼稍微不太一樣。

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=NetworkStream%20MemoryStream

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月23日 下午 02:42
  • 回隔壁那篇的連結,你也看一看吧~ 架構一樣,程式碼稍微不太一樣。

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=NetworkStream%20MemoryStream

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。


    謝謝您的回覆, 我再參考看看~~~
    2012年10月24日 上午 01:50