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();
}