[VB.Net] file transfer van client naar server via socket

Pagina: 1
Acties:

  • admsnake
  • Registratie: Juli 2003
  • Laatst online: 21-02-2022
Hallo,

Ik kan via onderstaande code een bestandje zenden maar dit komt niet altijd correct toe bij de server.
Bij een foto heb ik strepen. Soms komt een bestand wel correct toe :s ofwel kan ik het niet openen.
Iemand enig idee wat er fout gaat.

Afbeeldingslocatie: http://users.telenet.be/adm_snake/foto.JPG

client:

Private Sub sendFile()
Dim fileBuffer As Byte()
Dim fileStream As Stream
fileStream = File.OpenRead(txtFile.Text)
ReDim fileBuffer(fileStream.Length)
fileStream.Read(fileBuffer, 0, fileStream.Length)
Dim clientSocket As New TcpClient(txtIp.Text, 1024)
Dim netWorkStream As NetworkStream
netWorkStream = clientSocket.GetStream()
netWorkStream.Write(fileBuffer, 0, fileStream.Length)
netWorkStream.Close()
End Sub

server:

Private alSockets As ArrayList

Private Sub Server_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim IPHost As IPHostEntry = Dns.GetHostByName(Dns.GetHostName())
MsgBox("My IP address is " & IPHost.AddressList(0).ToString())
alSockets = New ArrayList
Dim thdListener As New Thread(New ThreadStart(AddressOf listenerThread))
thdListener.Start()
End Sub

Public Sub listenerThread()
Dim tcpListener As New TcpListener(IPAddress.Any, 1024)
Dim handlerSocket As Socket
Dim thdstHandler As ThreadStart
Dim thdHandler As Thread
tcpListener.Start()
Do
handlerSocket = tcpListener.AcceptSocket
If handlerSocket.Connected Then
MsgBox(handlerSocket.RemoteEndPoint.ToString() + " connected.")
SyncLock (Me)
alSockets.Add(handlerSocket)
End SyncLock
thdstHandler = New ThreadStart(AddressOf handlerThread)
thdHandler = New Thread(thdstHandler)
thdHandler.Start()
End If
Loop
End Sub

Public Sub handlerThread()
Dim handlerSocket As Socket
handlerSocket = alSockets(alSockets.Count - 1)
Dim networkStream As NetworkStream = New NetworkStream(handlerSocket)
Dim blockSize As Int16 = 1024
Dim thisRead As Int16
Dim dataByte(blockSize) As Byte
SyncLock Me
Dim fileStream As Stream
fileStream = File.OpenWrite("C:\upload.txt")
While (True)
thisRead = networkStream.Read(dataByte, 0, blockSize)
fileStream.Write(dataByte, 0, dataByte.Length)
If thisRead = 0 Then
Exit While
End If
End While
fileStream.Close()
End SyncLock
MsgBox("File Written")
handlerSocket = Nothing
End Sub

thx in advance

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
je doet:
code:
1
2
thisRead = networkStream.Read(dataByte, 0, blockSize)
fileStream.Write(dataByte, 0, dataByte.Length)


dat moet zijn:
code:
1
2
thisRead = networkStream.Read(dataByte, 0, blockSize)
fileStream.Write(dataByte, 0, thisRead)

Anders schrijf je altijd 1024 bytes weg ipv het aantal bytes dat werkelijk gelezen is.

En volgens mij klopt je thread locking ook niet helemaal; als je namelijk dit doet:
code:
1
 handlerSocket = alSockets(alSockets.Count - 1)

in je client thread, is de listener thread alweer bezig met lopen en die kan alSockets weer gewijzigd hebben.

[ Voor 37% gewijzigd door TlighT op 14-12-2004 19:36 ]