TCP / IP отправить файл vb.net - PullRequest
0 голосов
/ 05 июля 2019

Я почти ничего не знаю о приложениях TCP / ip, поэтому я пришел сюда за помощью. Следующие примеры кода являются частью проекта, который позволяет клиенту отправлять серверу файл. он прекрасно работает, он даже отправляет довольно большие файлы с разумной скоростью. единственная проблема заключается в том, что я хочу, чтобы сервер отправлял файлы клиента, а не так, как в большинстве примеров в сети, а именно, когда клиент отправляет файлы сервера. Я попытался переключиться между разными кодами и поменять местами разные строки кода, но, похоже, это только запутало. Кто-нибудь может мне помочь с этим?

Код сервера выглядит следующим образом:

  Dim Port As Integer = 500
        Dim listener As TcpListener = New TcpListener(IPAddress.Any, Port)
        listener.Start()



        Dim socket As Socket = listener.AcceptSocket
        Dim bufferSize As Integer = 1024
        Dim buffer() As Byte = Nothing
        Dim header() As Byte = Nothing
        Dim headerStr As String = ""
        Dim filename As String = ""
        Dim filesize As Integer = 0
        header = New Byte((bufferSize) - 1) {}
        socket.Receive(header)
        headerStr = Encoding.ASCII.GetString(header)
        Dim splitted() As String = headerStr.Split(New String() {"" & vbCrLf}, StringSplitOptions.None)
        Dim headers As Dictionary(Of String, String) = New Dictionary(Of String, String)
        For Each s As String In splitted
            If s.Contains(":") Then
                headers.Add(s.Substring(0, s.IndexOf(":")), s.Substring((s.IndexOf(":") + 1)))
            End If

        Next
        'Get filesize from header
        filesize = Convert.ToInt32(headers("Content-length"))
        'Get filename from header
        filename = headers("Filename")
        Dim bufferCount As Integer = Convert.ToInt32(Math.Ceiling((CType(filesize, Double) / CType(bufferSize, Double))))
        Dim fs As FileStream = New FileStream(filename, FileMode.OpenOrCreate)

        While (filesize > 0)
            buffer = New Byte((bufferSize) - 1) {}
            Dim size As Integer = socket.Receive(buffer, SocketFlags.Partial)
            fs.Write(buffer, 0, size)
            filesize = (filesize - size)

        End While

        listener.Stop()

Код клиента:

Imports System.IO
Imports System.Net.Sockets
Imports System.Text

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim IPAddress As String = TextBox1.Text
        Dim Port As Integer = 500
        Dim Filename As String = "D:\test\MyText.txt"
        Dim bufferSize As Integer = 1024
        Dim buffer() As Byte = Nothing
        Dim header() As Byte = Nothing
        Dim fs As FileStream = New FileStream(Filename, FileMode.Open)
        Dim read As Boolean = True
        Dim bufferCount As Integer = Convert.ToInt32(Math.Ceiling((CType(fs.Length, Double) / CType(bufferSize, Double))))
        Dim tcpClient As TcpClient = New TcpClient(IPAddress, Port)
        tcpClient.SendTimeout = 600000
        tcpClient.ReceiveTimeout = 600000
        Dim headerStr As String = ("Content-length:" & (fs.Length.ToString & ("" & vbCrLf & "Filename:" & ("C:\test\" & "MyText.txt" & vbCrLf))))
        header = New Byte((bufferSize) - 1) {}
        Array.Copy(Encoding.ASCII.GetBytes(headerStr), header, Encoding.ASCII.GetBytes(headerStr).Length)
        tcpClient.Client.Send(header)
        Dim i As Integer = 0
        Do While (i < bufferCount)
            buffer = New Byte((bufferSize) - 1) {}
            Dim size As Integer = fs.Read(buffer, 0, bufferSize)
            tcpClient.Client.Send(buffer, size, SocketFlags.Partial)
            i = (i + 1)
        Loop

        tcpClient.Client.Close()
        fs.Close()
    End Sub
...