0

C# ソケットを使用して画像を送信しようとすると、常に不完全な画像として受信されます。そして、私が受け取る決定されたサイズはありません。たとえば、50 KB のデータを送信しようとすると、30、38、25、20 などを受け取る可能性があります...完全にランダムです。これが私のコードです。これを解決するのを手伝っていただければ幸いです。ありがとうございました。

クライアント側:

Socket soketDinleme;
byte[] gelenByte = new byte[999999999];
private void frmAnaform_Load(object sender, EventArgs e)
    {
        soketDinleme = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        soketDinleme.Bind(new IPEndPoint(IPAddress.Any, 4800));
        soketDinleme.Listen(1);
        soketDinleme.BeginAccept(new AsyncCallback(KabulEdilme), null);
    }

    void KabulEdilme(IAsyncResult iar)
    {
        Socket soket = soketDinleme.EndAccept(iar);
        soket.BeginReceive(gelenByte, 0, gelenByte.Length, SocketFlags.None, new AsyncCallback(VeriGeldiginde), soket);
        soketDinleme.BeginAccept(new AsyncCallback(KabulEdilme), null);
    }

    void VeriGeldiginde(IAsyncResult iar)
    {
        Socket soket = (Socket)iar.AsyncState;
        int uzunluk = soket.EndReceive(iar);
        byte[] veri = new byte[uzunluk];
        Array.Copy(gelenByte, veri, veri.Length);
        string kontrol = Encoding.UTF8.GetString(veri);
        if (kontrol.Contains("kaydol"))
        {
            ServerIslemler.Kaydol.ResimKaydet(veri);
        }
        else
        {
            MemoryStream ms = new MemoryStream(veri);
            Image profilResmi = Bitmap.FromStream(ms);
            profilResmi.Save("C:/denemeResim.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.Close();
        }
    }

サーバ側:

        public static void KayıtVerisiGonder(string gonderilcek, string resimYolu)
        {
            //byte[] metin = Encoding.UTF8.GetBytes("kaydol/" + gonderilcek + IP() + "|");
            Bitmap bmp = new Bitmap(resimYolu);
            MemoryStream ms = new MemoryStream();
            bmp.Save(ms, ImageFormat.Jpeg);
            byte[] resim = ms.ToArray();
            bmp.Dispose();
            ms.Close();
            Socket soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            soket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4800));
            soket.Send(resim, 0, resim.Length, SocketFlags.None);
            soket.Close();
        }
4

0 に答える 0