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