Отправка JPEG через сокет TCP ... иногда неполное - PullRequest
1 голос
/ 17 апреля 2010

Vb.net

Привет

Я работаю над проектом уже несколько месяцев (vb 2008 express). Есть одна последняя проблема который я не могу решить.

Мне нужно отправить изображения клиенту с «сервера» (слушателя). Приведенный ниже код работает большую часть времени, но иногда изображение неполное. Я полагаю, что это может быть связано с изменением размеров пакетов tcp, возможно, ограниченных тем, насколько он занят в сети. я Я видел примеры кода, который разбивает изображение на части и отправляет их, но я не могу заставить их работать, возможно, потому что я использую другую версию VB. Картинки для отправки маленькие 20к макс.

Любые примеры работающего кода были бы замечательными. Я экспериментировал и терпел неудачу с этим последним препятствием в течение нескольких недель.

Спасибо в ожидании.

Клиент -----

Sub GetPic()


        '------- Connect to Server
        ClientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, _ ProtocolType.Tcp)
        ClientSocket.Connect(Epoint)

        '------- Send Picture Request
        Dim Bytes() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes("Send Picture")
        ClientSocket.Send(Bytes, Bytes.Length, SocketFlags.None)

        '------- Receive Response
        Dim RecvBuffer(20000) As Byte
        Dim Numbytes As Integer

        Numbytes = ClientSocket.Receive(RecvBuffer)

        Dim Darray(Numbytes) As Byte
        Buffer.BlockCopy(RecvBuffer, 0, Darray, 0, Numbytes)

        '------- Close Connection
        ClientSocket.Shutdown(SocketShutdown.Both)
        ClientSocket.Close()

        '-------
        Dim MStrm = New MemoryStream(Darray)
        Picture = Image.FromStream(MStrm)


End Sub

Слушатель -----

'Threaded from a listener


    Sub ClientThread(ByVal Client As TcpClient)

        Dim MStrm As New MemoryStream
        Dim Rbuffer(1024) As Byte
        Dim Tbyte As Byte()
        Dim NStrm As NetworkStream = Client.GetStream()

        Dim I As Integer = NStrm.Read(Rbuffer, 0, Rbuffer.Length)
        Dim Incoming As String = System.Text.Encoding.ASCII.GetString(Rbuffer, 0, I)

        If Incoming = "Send Picture" then
                    Picture Save(MStrm, Picture.RawFormat)
                    Tbyte = MStrm.ToArray
                    NStrm.Write(Tbyte, 0, Tbyte.Length)
              End if

        Client.Close()

End Sub

1 Ответ

1 голос
/ 25 апреля 2010

то, как вы получаете ваше изображение, совершенно неверно, поступая так:

Numbytes = ClientSocket.Receive(RecvBuffer)

у вас есть достаточно шансов получить часть данных, потому что сокет может на самом деле иметь меньшее количество, чем полное изображение в своем буфере. В любом случае, попробуйте получить его так (я дам пример в c #):

MemoryStream responseStream = new MemoryStream();
byte[] recvBuffer = new recvBuffer[4096]; // just some size
int read = 0; // indicates how much data actually read from socket, can be smaller then buffer
do{
    read = ClientSocket.Receive( recvBuffer ); // recieve data
    responseStream.write( recvBuffer, 0, read ); // write it to resposne stream for later use
}
while( read != 0 );

Это должно сработать, но я бы сделал это немного иначе в вашем случае. Вот код клиента:

Socket s = new Socket( blablabla );
s.Connect( endPoint );
NetworkStream clientStream = new NetworkStream(s);
clientStream.Write( "Send picture" ); // send a command to server

int pictureSize = clientStream.ReadInt(); // here we expect to read following picture's size
byte[] pictureBuffer = clientStream.ReadBytes( pictureSize );

И сервер, часть слушателя:

Socket serverSocket = new Socket( blablabla );
serverSocket.Bind( blabla );
serverSocket.Listen( 100 );

while( true ){
    Socket clientSocket = serverSocket.Accept();
    Thread t = new Thread( new ParametrizedThreadStart( (object Obj) =>
    {
        Socket clientSocket = (Socket)Obj;
        NetworkStream clientStream = new NetworkStream( clientSocket );
        string command = clientStream.ReadString();
        if( command == "Send picture" ){
            // get ur picture here
            // get it's size
            clientStream.Write( pictureSize );
            clientStream.Write( pictureBytes );
        }
    } ) );
    t.start( clientSocket );
}

Надеюсь, этот псевдокод понятен, не стесняйтесь задавать вопросы:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...