2

私がやろうとしているのは、クライアントの画面の画像をサーバーに転送することです。これを行うには、クライアント側で画面の画像を取得し、それをバイト配列に変換して、そのバイト配列を TCP ソケット経由でサーバーに送信します。サーバー側ではクライアントからのバイト配列を画像に変換してpictureBoxに入れています。

さて、結果はクライアント側ではクールに見えますが、サーバー側で得られる画像は歪んでいます: http://i.stack.imgur.com/wsLNh.png

右の写真がクライアント側(画面を保存してサーバーに送信する)で、左がサーバー側です。サーバー側でわかるように、picutre はいっぱいではありません。

これらのコードを使用して、画像を送信し、画像を受信し、変換します(バイト>画像||画像>バイト):

private Image getScreen()
{
    Size s = Screen.PrimaryScreen.Bounds.Size;
    Bitmap b = new Bitmap(s.Height, s.Width);
    Graphics g = Graphics.FromImage(b);
    g.CopyFromScreen(0, 0, 0, 0, s);

    return b;
}

private byte[] BmpToBytes(Image bmp)
{
    MemoryStream ms = new MemoryStream();
    bmp.Save(ms, ImageFormat.Jpeg);
    byte[] bmpBytes = ms.GetBuffer();
    bmp.Dispose();
    ms.Close();

    return bmpBytes;
}

private Image BytesToImg(byte[] bmpBytes)
{
    MemoryStream ms = new MemoryStream(bmpBytes);
    Image img = Image.FromStream(ms);
    return img;
}


Client side:
private void SendScreenToServer()
{
    while (true)
    {
        byte[] sendBytes = new byte[12500];
        sendBytes = BmpToBytes(getScreen());
        pictureBox1.Image = getScreen();
        serverStream.Write(sendBytes, 0, sendBytes.Length);
        serverStream.Flush();
    }
}

Server side:
private void GetScreenFromClient()
{
    while (true)
    {
        byte[] bytesFrom = new byte[12500];
        networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);

        try
        {
            pictureBox1.Image = BytesToImg(bytesFrom);
        }
        catch { }
    }
}

誰が私が間違っているのか知っていますか? または、ソケットを介してイメージを転送する他のオプションはありますか?

4

3 に答える 3

2

画像の転送に使用するコードを示していないため、やみくもに推測します。

stream.Read(buffer,start,length)バイトを取得することを保証するものlengthではなく、バッファをオーバーフローさせない上限です。読み取ったバイト数を示す戻り値を確認する必要があります。

編集

何をnetworkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize)返すかを確認します。おそらく 12500 未満です。

ストリームから読み取るバイト数を正確に知るために、画像を送信する前に画像のサイズを送信する必要がある場合もあります。

于 2012-09-14T17:45:48.767 に答える
1

プロトコルの設計と実装を忘れていました。

    networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);

これは、TCP データ接続から大量のバイトを受信します。次に、プロトコルに従ってこれらのバイトを処理する必要があります。

受信者は、画像全体を受信したことをどのように知ることになっていますか? 方法を決定してから、それをコーディングする必要があります。

于 2012-09-14T17:48:01.970 に答える
0

最初に画像全体を送信するのではなく、毎回ネットワーク経由で画像全体を転送し、次回からは前の画像と現在の画像の違いのみをサーバーに送信し、サーバー側で適用するだけでよいのは悪い考えです。現在のイメージとの違い。Google を検索して、ネットワーク経由で画像の差分を送信するための適切なロジックを取得し、サーバー側で現在の画像に差分を適用できます。ありがとう

于 2012-12-06T07:31:58.173 に答える