我有一个使用异步套接字的客户端/服务器应用程序。我有一个从服务器端向客户端发送数据的方法,客户端有一个处理这些数据和控制客户端表单控件的方法。
由于使用异步套接字,我需要使用Control.Invoke
方法来访问主线程。但是我遇到了一个问题——在我使用Control.Invoke
它之后,开始向服务器端发送数据问题。它进入 socketClient.Send(byteArray); 但不向服务器发送数据。如果我不使用 Invoke.Method,我将无法控制客户端表单控件:(
我必须做什么?
好的,我发现了我的问题,但不是关于 Control.Invoke 它的套接字数据传输问题。但我无法解决它。当我重复使用 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));
}