Я пытаюсь сделать код, который ждет, пока не будет поднято событие. Я использовал ответ на этой странице answer для связи Tcp. event
PacketReceived
будет поднят при получении пакета.Подождите, пока не будет возбуждено событие
Private Sub FooBar()
'Send some Tcp Message here`
'Wait until a reply is received here
'Execute some code when reply is received
End Sub
Это код. Отправляет имя файла и для чего принадлежит файл. В нем нет существования файла проверки
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim t = New Thread(AddressOf SendFile)
Dim f = New FileAndData
f.FileList = SlideShowItems
f.FileType = "tempSlideShowImage"
t.Start(f)
End Sub
Private Sub SendFile(obj As Object)
Dim fD = CType(obj, FileAndData)
For Each item In fD.FileList.Items
Dim fileIn As New FileStream(item, FileMode.Open)
Const chunkSize = 10485760
Dim messageFileNamePkt As New TcpMessagePacket(Encoding.Default.GetBytes(Path.GetFileName(item)), TcpMessagePacket.PacketHeader.Filename)
messageFileNamePkt.Send(_etcClient.Client) 'Send file name
Dim messageFiletype As New TcpMessagePacket(Encoding.Default.GetBytes(fD.FileType), TcpMessagePacket.PacketHeader.Filetype)
messageFiletype.Send(_etcClient.Client) 'Send file type
'Wait here for reply if for file existence
While fileIn.Position < fileIn.Length
Dim bytes(chunkSize) As Byte
If fileIn.Length - fileIn.Position < bytes.Length Then
ReDim bytes(fileIn.Length - fileIn.Position - 1)
End If
fileIn.Read(bytes, 0, bytes.Length)
Dim messageFilePkt As New TcpMessagePacket(bytes, TcpMessagePacket.PacketHeader.FileData)
messageFilePkt.Send(_etcClient.Client) 'Send file chunks
End While
fileIn.Close()
Dim messageFileEnd As New TcpMessagePacket(Encoding.Default.GetBytes(""), TcpMessagePacket.PacketHeader.TransferComplete)
messageFileEnd.Send(_etcClient.Client) 'Send transfer complete
Next
End Sub
Public Class FileAndData
Public FileList As ListBox
Public FileType As String
End Class
И это обработчик для ответа
Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles _etcClient.PacketReceived
End Sub
Привет! Это хорошая реализация моего кода, который у вас есть здесь, однако есть две вещи, которые я хотел бы отметить, что может сделать ее более эффективной: ** 1) ** Размер блока 10485760 байт (10 МБ) равен _very_ чтобы поместить в сетевой буфер для каждой отправки и, скорее всего, значительно замедлить работу. - Из моих собственных тестов я обнаружил, что идеальный размер буфера составляет 8192-32768 (8-32 КБ) - даже по локальной сети. Все выше и ниже этих значений заставляло отправлять гораздо медленнее. –
(Чтобы разделить это на два комментария): ** 2) ** При отправке пакетов без данных вместо 'Encoding.Default.GetBytes (" ")' вы могли просто сделать: 'New Byte() {}' для создания пустого байтового массива. Разница в скорости выполнения между двумя, вероятно, будет всего в несколько сотен микросекунд до миллисекунды, но это все еще является улучшением, которое устраняет ненужную обработку. –