none
vb2005 socket傳送大檔案的方法 RRS feed

  • 問題

  • 請問一下在vb2005中要用socket傳送檔案的時後

    一個buffer最大是 8159byte

    爬文的結果是超過這個 8159就要對Filestream做分割再傳的動作

     

    分割傳送的範例類似下面code 不過分割接收我想不到怎做

    也找不到範例,可以請強者跟小弟講一下嘛??

    感激不盡

     

     If OpenFileDialog1.ShowDialog() = DialogResult.OK Then

                Dim fs As New IO.FileStream(OpenFileDialog1.FileName, IO.FileMode.OpenOrCreate, IO.FileAccess.Read) '你所要传输的文件 

                IntBlockQty = fs.Length \ IntBlockSize  '決定幾各block

                IntBlockLast = fs.Length Mod IntBlockSize  '剩餘的大小

               然後用loop
                  

    分割類似像這樣子

    2008年12月3日 上午 08:07

解答

  • socket 的 buffer 預設是 8192 bytes ,可以調整大小,但問題是你接收時,要用迴圈去讀,前面相關討論很多了,先翻一遍吧。

     

    2008年12月3日 上午 08:41

所有回覆

  • socket 的 buffer 預設是 8192 bytes ,可以調整大小,但問題是你接收時,要用迴圈去讀,前面相關討論很多了,先翻一遍吧。

     

    2008年12月3日 上午 08:41
  • 以下是小弟根據範例改寫的發送端的 code,因為檔案比較大所以是分段送出,可是接收端我實在沒頭序該怎寫

    請問高手

    1.先接收IntBlockQty ,當作loop的次數

    2.開始接收data

    3.接收剩餘的

    4.組合起來

     

    不過不知道怎寫,是拿發送端的來改就好了嘛?請會的高手指導一下,謝謝

     

    =========================以下是我的發送端code==============================

    Dim Buffer() As Byte  '定義大小
            Dim o As Integer = 0
            Dim IntLoop As Integer
            Dim IntBlockQty As Integer
            Dim IntBlockLast As Integer
            Dim IntBlockSize As Integer = 8159
            Dim IntSendLength As Integer


            Dim mysocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) '建立一個新的socket

            Dim myend As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 36000)

            mysocket.Connect(myend)
         

            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then

                Dim fs As New IO.FileStream(OpenFileDialog1.FileName, IO.FileMode.OpenOrCreate, IO.FileAccess.Read) '你所要传输的文件

     

                IntBlockQty = fs.Length \ IntBlockSize   <=分割的數目
                IntBlockLast = fs.Length Mod IntBlockSize   <=剩餘的數目


                Dim ee() As Byte = {"IntBlockQty"}
                mysocket.send(ee)  <=傳送分割數目大小出去

     

                For IntLoop = 0 To IntBlockQty - 1  <=oop,依次把不同的陣列送出
                    Erase Buffer
                    ReDim Buffer(IntBlockSize - 1)
                    fs.Read(Buffer, 0, IntBlockSize)          <=buffer
                    mysocket.send(buffer)
                

                    IntSendLength = IntSendLength + Buffer.Length    <=這行我不太清楚是幹嘛的

                Next IntLoop


                        If IntBlockLast > 0 Then               <=如果有剩下的檔案

                    Erase Buffer
                    ReDim Buffer(IntBlockLast - 1)

                              fs.Read(Buffer, 0, IntBlockLast)

                    '傳送檔案
                    mysocket.Send(Buffer)

                    IntSendLength = IntSendLength + Buffer.Length

                    fs.Close()

                    MessageBox.Show("上傳檔案結束")


                End If

     

     

    2008年12月3日 下午 01:31
  • 剛想了逼下

    請問可以用

    do loop 的迴圈寫嘛??

    當傳來陣列的資料小於 8159 就代表是最後一筆了

    這樣對嘛??

     


            Do
                wr.Write(rebyte, 0, rebyte.Length - 1)    <=依次把收到的放進來
                rebyte() += rebyte()                             <=累加上去
                fs.Close()
            Loop

            While rebyte < 8159                            <=當傳送進來的資料 <8159時,代表傳完了

     

    請各位大大能夠指導一下小弟 ,多謝了 

     

    2008年12月3日 下午 01:55