非同期ソケットを使用するクライアント/サーバーアプリケーションがあります。サーバー側からクライアントにデータを送信する方法があり、クライアントはこのデータを処理してクライアントのフォーム制御を制御する方法を持っています。
非同期ソケットを使用しているため、Control.Invoke
メインスレッドにアクセスするためのメソッドを使用する必要があります。しかし、問題が発生しました。使用するControl.Invoke
と、サーバー側へのデータ送信の問題が発生します。それはsocketClient.Send(byteArray);に入ります。ただし、サーバーにデータを送信しません。Invoke.Methodを使用しない場合、クライアント側のフォームコントロールを制御できません:(
私がしなければならないこと?
問題は見つかりましたが、Controlに関するものではありません。ソケットデータ送信の問題を呼び出しますが、解決できませんでした。socketClient.Send()メソッドを繰り返し使用すると、最初のsocketclient.Send()のみが機能します。これが私のコードです;
//クライアントが接続されている場合、このメソッドは機能しています。
void baglantiSaglandi(IAsyncResult sonuc){
try
{
Aday gelenAday = new Aday();
bagliAdayListesi.Add(gelenAday);
gelenAday.adaySoket = serverSocket.EndAccept(sonuc);
TamponTemizle();
// Client'in gönderdiği veriyi kabul edip, boyutunu gelendataBoyutu isimli değişkene atadık.
int gelendataBoyutu = gelenAday.adaySoket.Receive(tampon);
// Client'in ip adresini ipadresi property imize ekledik.
gelenAday.ipAdresi = Mesaj(StringeDonustur(tampon, gelendataBoyutu));
lstKullanicilar.Items.Add(gelenAday.ipAdresi);
grpYonetim.Enabled = true;
lblUyari.Visible = false;
serverSocket.BeginAccept(new AsyncCallback(baglantiSaglandi), null);
TamponTemizle();
gelenAday.adaySoket.BeginReceive(tampon, 0, tampon.Length, SocketFlags.None, new AsyncCallback(mesajGeldi), gelenAday);
}
catch (SocketException ex)
{
MessageBox.Show(ex.Message);
}
}
//クライアントがサーバーにメッセージを送信したとき、このコードブロックは機能しています。
void mesajGeldi(IAsyncResult sonuc){
Aday stateAday = sonuc.AsyncState as Aday;
try
{
int gelenDataBoyutu = stateAday.adaySoket.EndReceive(sonuc);
MesajKontrol(StringeDonustur(tampon, gelenDataBoyutu), stateAday.ipAdresi);
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.ConnectionReset)
{
foreach (Aday cikanAday in bagliAdayListesi)
{
if (cikanAday.ipAdresi == stateAday.ipAdresi)
{
cikanAday.adaySoket.Close();
bagliAdayListesi.Remove(cikanAday);
// lstKullanicilar.Items.Remove(cikanAday.ipAdresi);
if (lstKullanicilar.Items.Count <= 0)
{
grpYonetim.Enabled = false;
lblUyari.Visible = true;
}
break;
}
}
}
}
}
//このメソッドはクライアントのメッセージを処理しています
void MesajKontrol(string mesaj, string aday)
{
if (mesaj.Length < 1)
return;
switch (mesaj.Substring(0, 3))
{
case "/s/":
string[] yanlisDogru = Mesaj(mesaj).Split(',');
foreach (Aday cikanAday in bagliAdayListesi)
{
if (cikanAday.ipAdresi == aday)
{
lstKullanicilar.Items[bagliAdayListesi.IndexOf(cikanAday)].SubItems.Add(yanlisDogru[1]);
lstKullanicilar.Items[bagliAdayListesi.IndexOf(cikanAday)].SubItems.Add(yanlisDogru[0]);
}
}
break;
case "/q/":
foreach (Aday cikanAday in bagliAdayListesi)
{
if (cikanAday.ipAdresi == aday)
{
cikanAday.adaySoket.Close();
bagliAdayListesi.Remove(cikanAday);
//lstKullanicilar.Items.Remove(cikanAday.ipAdresi);
if (lstKullanicilar.Items.Count <= 0)
{
grpYonetim.Enabled = false;
lblUyari.Visible = true;
}
break;
}
}
break;
case "/b/":
foreach (Aday cikanAday in bagliAdayListesi)
{
if (cikanAday.ipAdresi == aday)
{
lstKullanicilar.Items[bagliAdayListesi.IndexOf(cikanAday)].SubItems.Add(Mesaj(mesaj));
lstKullanicilar.Items[bagliAdayListesi.IndexOf(cikanAday)].SubItems.Add("0");
lstKullanicilar.Items[bagliAdayListesi.IndexOf(cikanAday)].SubItems.Add("0");
}
}
break;
default:
break;
}
}
//このコードブロックはクライアント側から機能しており、問題はここから始まります。2つのSendメソッドが機能していますが、サーバーでは最初のメソッドのみが実行されます。
private void btnYazdir_Click(object sender, EventArgs e)
{
clientSocket.Send(ByteArrayeDonustur("/s/" + yanlis.ToString() + "," + dogru.ToString()));
clientSocket.Send(ByteArrayeDonustur("/b/" + txtAdSoyad.Text));
}