Member 11450536 Ответов: 1

Только часть изображения, отправленного через TCP


Я отправляю скриншоты каждые 500 мс на один и тот же компьютер, но он получает только около 75% изображения, и полученная сумма меняется с каждым скриншотом. При отправке на другой компьютер в той же сети (через ethernet) проходит только крошечная часть экрана.

Код для отправки скриншотов:

sendDataToServer("$scr:" & Convert.ToBase64String(New ImageConverter().ConvertTo(screenshot, GetType(Byte()))))

Private Function screenshot() As Bitmap
        Static cap As Bitmap = Nothing
        If cap IsNot Nothing Then GC.RemoveMemoryPressure(cap.Width * cap.Height * 4)
        cap = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppRgb)
        GC.AddMemoryPressure(cap.Width * cap.Height * 4)
        Using graph As Graphics = Graphics.FromImage(cap)
            graph.CopyFromScreen(0, 0, 0, 0, cap.Size, CopyPixelOperation.SourceCopy)
        End Using
        Return cap
    End Function


Получение скриншотов:

Private Sub readCallback(result As IAsyncResult)

        If closeMe Then Return

        Try
            networkStream = clientSocket.GetStream()
            Dim read As Integer = networkStream.EndRead(result)
            If read = 0 Then
                networkStream.Close()
                clientSocket.Close()
                Return
            End If

            Dim buffer As Byte() = TryCast(result.AsyncState, Byte())
            Dim data As String = Encoding.UTF8.GetString(buffer, 0, read)

            Dim cmd As String = Nothing
            If data.Contains(":") Then
                cmd = data.Split(":")(0)
                data = data.Remove(0, cmd.Length + 1)
            Else
                cmd = data
                data = Nothing
            End If

            Select Case (cmd) '! = request, $ = response
                Case "$scr"
                    main.crossThread(Utils.EnumCrossThreadFunction.updateWatchWindow, Utils.getArgs(Utils.bytesToImage(Convert.FromBase64String(data))))                
                Case "$ping"
                    main.getPingData()(username) = 1                              
            End Select

            awaitRequest()

        Catch ex As Exception

        End Try

    End Sub


Кто-нибудь знает причину этого? Клиент также отключается через несколько секунд, как только скриншоты начинают отправляться,сообщая мне, что соединение насыщается.

Что я уже пробовал:

Я пробовал использовать UDP и различные наборы TCP-кода.

1 Ответов

Рейтинг:
1

jkirkerx

Сначала вам нужно написать правильный код сокета в VB на обоих концах.

TCP может запускаться и останавливаться, и продолжать с того места, где он остановился, или, лучше сказать, может передавать часть данных, затем ждать ответа, говоря, что данные целы, а затем снова циклировать. Например, для переговоров по электронной почте или SMTP.

UDP используется в основном для потоков, таких как потоковое видео. Он открывает порт и начинает потоковую передачу фрагментов данных в приемник, так что вы должны контролировать буферизацию данных.

Поэтому сначала напишите хорошую программу сокета, протестируйте ее, а затем просто измените данные на свой образ.

Вот хорошее место для начала. Когда вы сможете освоить это сначала, тогда вы сможете написать лучшую программу для отправки изображений, чтобы они оставались нетронутыми на стороне приемников.

VB.NET Программирование сокетов[^]


Member 11450536

Проблема с UDP заключается в том, что размер буфера дейтаграммы слишком мал для хранения изображения. С TCP не все изображение проходит через него.

jkirkerx

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.receivebuffersize(v=vs. 110).aspx