В настоящее время я создаю приложение для передачи файлов с некоторыми функциями ведения журнала. Что он делает, так это то, что каждый раз, когда клиент подключается или отключается, он отправляет журналы (строковое сообщение) на сервер. Часть ведения журнала работает нормально, но когда я пытаюсь отправить файлы, программа дает сбой.
Похоже, это чисто проблема на стороне сервера. Что происходит, так это то, что предыдущие данные; которое представляет собой строковое сообщение для регистрации, отправленное клиентом, похоже, застревает в сетевом потоке. Когда я пытаюсь отправить файл после подключения к серверу, я получаю сообщение об ошибке недопустимые символы в пути.
Вот снимок экрана с ошибкой.
Я полагаю, что это происходит потому, что, как вы можете видеть на скриншоте выше в переменной FileName
, часть строки ("подключено"), которая была отправлена, когда клиент подключился, застрял в сетевом потоке. hello.cpp — это имя отправляемого файла.
Вот код.
Dim ClientSocket As TcpClient = CType(tcpSocket, TcpClient)
Dim networkStream As NetworkStream = ClientSocket.GetStream() 'This stream is
'for the logging part. This part here, I think causes the error because when I
'remove this and the conditions for the logging part, leaving the file sharing
'algorithm alone, the whole program works.
While FileSharingStarted
If CBool(ClientSocket.Available) Then
Dim ByteData(ClientSocket.ReceiveBufferSize) As Byte
networkStream.Read(ByteData, 0, CInt(ClientSocket.ReceiveBufferSize))
fileLogMessage = Encoding.ASCII.GetString(ByteData)
If fileLogMessage.Contains("is connected." & Environment.NewLine) Then
'This block here is for logging purposes. It receives the string
'message sent by the client when it connects and does some stuffs.
ElseIf fileLogMessage.Contains("is disconnected." & Environment.NewLine) Then
'This block here is for logging purposes again. It receives the
'string message sent by the client when it disconnects and then
'does some stuffs.
Else
'This part is for receiving the file sent by the client.
Dim FileName, FilePath As String
Dim FileLength As Long
Dim binaryReader As New BinaryReader(ClientSocket.GetStream())
FileName = binaryReader.ReadString()
FileLength = binaryReader.ReadInt64()
FilePath = Path.Combine(System.Environment.CurrentDirectory & "\home", FileName)
Dim FileData(8092) As Byte
Dim TotalData As Long = 0
Dim ReadBytes As Integer = -1
Using FileStream As New FileStream(FilePath, FileMode.Create, FileAccess.Write)
FileSharingStatusBar.Panels.Item(1).Text = "Receiving file . . ."
Do Until TotalData = FileLength
ReadBytes = ClientSocket.GetStream.Read(FileData, 0, FileData.Length())
FileStream.Write(FileData, 0, ReadBytes)
TotalData += ReadBytes
Loop
End Using
MessageBox.Show("File received.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information)
FileSharingStatusBar.Panels.Item(1).Text = "Idle."
End If
End If
End While
Мне просто интересно, почему это происходит. Я что-то упустил здесь? Любое объяснение или предложение разобраться с этим будет высоко оценено. Пожалуйста, просветите меня. :)
networkStream
и весь связанный с ним код? Вы можете успешно прочитать весь файл? Я спрашиваю об этом, потому что ваше изображение показывает очень большой размер файла (более гигабайта). - person Alex Essilfie   schedule 20.02.2013FileName = binaryReader.ReadString()
— это код, который я использую для определения имени получаемого файла. Мое текущее понимание состоит в том, что сетевой поток должен очищаться или очищаться после получения данных. Разве это не так? Поправьте меня если я ошибаюсь. - person Ryklon Zen   schedule 20.02.2013