【发布时间】:2016-07-25 07:32:13
【问题描述】:
我正在尝试在 VB.NET 应用程序中通过 TCP/IP 传输文件,我对传输文件的大小有疑问,这里是代码:
服务器:
Imports System.Net.Sockets
Imports System.Text
Imports System.Net
Imports System.ComponentModel
Class MainWindow
Dim Timer As New Stopwatch
Dim LocalAddr As IPAddress
Dim ServerSocket As TcpListener
Dim RequestCount As Integer
Dim ClientSocket As TcpClient
Dim BW As New BackgroundWorker With {.WorkerSupportsCancellation = True}
Dim BWAccept As New BackgroundWorker With {.WorkerSupportsCancellation = True}
Dim FileStreamer As New System.IO.FileStream("C:\Users\m_shahgholi\Desktop\New folder\test.dcm", IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.ReadWrite)
Private Sub DoWorker(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
While (True)
Try
RequestCount = RequestCount + 1
Dim networkStream As NetworkStream = ClientSocket.GetStream()
Dim bytesFrom(ClientSocket.ReceiveBufferSize) As Byte
networkStream.Read(bytesFrom, 0, CInt(ClientSocket.ReceiveBufferSize))
'IO.File.WriteAllBytes("C:\temp\1.dcm", bytesFrom)
Me.Dispatcher.Invoke(Sub()
If ClientSocket.Available <> 0 Then
TextBoxClientBufferSize.Text = ClientSocket.Available.ToString
End If
FileStreamer.Write(bytesFrom, 0, CInt(ClientSocket.ReceiveBufferSize))
End Sub)
'Dim dataFromClient As String = System.Text.Encoding.ASCII.GetString(bytesFrom)
'dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"))
'msg("Data from client - " + dataFromClient)
Dim serverResponse As String = "Server response " + Convert.ToString(RequestCount) + "$"
Dim sendBytes As Byte() = Encoding.UTF8.GetBytes(serverResponse)
networkStream.Write(sendBytes, 0, sendBytes.Length)
networkStream.Flush()
msg(serverResponse)
'networkStream.Close()
Catch ex As Exception
Exit While
End Try
End While
End Sub
Private Sub CompleteWorker(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
ClientSocket.Close()
ServerSocket.Stop()
msg("exit")
StackPanelClient.Visibility = Windows.Visibility.Collapsed
Timer.Stop()
TextBoxClientBufferSize.Text = Timer.Elapsed.ToString
FileStreamer.Close()
End Sub
Sub msg(ByVal mesg As String)
mesg.Trim()
Me.Dispatcher.Invoke(
Sub()
RichTextBoxRecivedText.AppendText(mesg + vbCrLf)
RichTextBoxRecivedText.ScrollToEnd()
End Sub)
End Sub
Private Sub ButtonStart_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles ButtonStart.Click
TextBoxServerIP.Text = System.Net.Dns.GetHostByName(Dns.GetHostName()).AddressList(0).ToString()
LocalAddr = IPAddress.Parse(TextBoxServerIP.Text)
ServerSocket = New TcpListener(LocalAddr, 8888)
ServerSocket.Start()
msg("Server Started")
WaitForClientProgressIndicator.Visibility = Windows.Visibility.Visible
LabelServerIP.Visibility = Windows.Visibility.Visible
TextBoxServerIP.Visibility = Windows.Visibility.Visible
WaitForClientProgressIndicator.Start()
StackPanelServer.Background = Brushes.Red
AddHandler BWAccept.DoWork, AddressOf AcceptDoWorker
AddHandler BWAccept.RunWorkerCompleted, AddressOf AcceptCompleteWorker
BWAccept.RunWorkerAsync()
End Sub
Private Sub AcceptDoWorker(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
ClientSocket = ServerSocket.AcceptTcpClient
ServerSocket.Server.ReceiveBufferSize = 8192 * 2
ClientSocket.ReceiveBufferSize = 8192 * 2
End Sub
Private Sub AcceptCompleteWorker(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
msg("Accept connection from client")
Me.Dispatcher.Invoke(Sub() TextBoxClientBufferSize.Text = ClientSocket.ReceiveBufferSize)
RequestCount = 0
RichTextBoxRecivedText.Background = Brushes.Black
RichTextBoxRecivedText.Foreground = Brushes.WhiteSmoke
WaitForClientProgressIndicator.Visibility = Windows.Visibility.Collapsed
WaitForClientProgressIndicator.End()
ButtonStart.Visibility = Windows.Visibility.Collapsed
ButtonStop.Visibility = Windows.Visibility.Visible
AddHandler BW.DoWork, AddressOf DoWorker
AddHandler BW.RunWorkerCompleted, AddressOf CompleteWorker
Timer.Start()
BW.RunWorkerAsync()
TextBoxClientIP.Text = DirectCast(ClientSocket.Client.RemoteEndPoint, IPEndPoint).Address.ToString
StackPanelClient.Visibility = Windows.Visibility.Visible
StackPanelServer.Background = Brushes.WhiteSmoke
End Sub
Private Sub ButtonStop_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles ButtonStop.Click
ClientSocket.Close()
ServerSocket.Stop()
msg("Server Stopped")
ButtonStart.Visibility = Windows.Visibility.Visible
ButtonStop.Visibility = Windows.Visibility.Collapsed
BW.CancelAsync()
BWAccept.CancelAsync()
StackPanelClient.Visibility = Windows.Visibility.Collapsed
StackPanelServer.Visibility = Windows.Visibility.Collapsed
End Sub
End Class
客户:
Imports System.Net.Sockets
Imports System.IO
Class MainWindow
Dim networkStream As NetworkStream
Private Sub ButtonStart_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles ButtonStart.Click
Dim tcpClnt As New System.Net.Sockets.TcpClient
Dim port As Integer = 8888
Try
tcpClnt.Connect(TextBoxServerIP.Text, port)
networkStream = tcpClnt.GetStream()
Catch ex As Exception
MsgBox(ex.ToString())
End Try
End Sub
Private Sub ButtonSend_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles ButtonSend.Click
Dim fs As FileStream
fs = New FileStream("D:\Software\NIC\DCM\Series1\10.129.1125.111.1246.1101.20150106081616.1.dcm", FileMode.Open)
Dim objReader As New BinaryReader(fs)
Dim send() As Byte = objReader.ReadBytes(fs.Length)
networkStream.Write(send, 0, send.Length)
objReader.Close()
fs.Close()
End Sub
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
TextBoxServerIP.Text = "192.168.1.106"
End Sub
End Class
应用程序可以运行,但出现错误。 假设一个大小为 1000 字节的文件,在此代码中,缓冲区大小为 16KB。传输的文件是 16KB 而不是 1000 字节,并且在文件末尾添加了一些 0。 我必须做些什么来纠正?
【问题讨论】:
-
你忽略了
networkStream.Read()的返回值。 -
@CodeCaster:您能告诉我更多我必须做些什么来更正吗?
-
当然。阅读
NetworkStream.Read()的文档 :) 很抱歉,但你不会找到很多愿意帮助你的人。 TCP 是低级的,很难正确处理——你真的需要知道你在做什么。
标签: .net vb.net sockets tcpclient tcp-ip