Я почти ничего не знаю о приложениях 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