Witam. Jestem w trakcie pisania komunikatora internetowego. Aktualnie próbuję rozwiązać problem związany z prywatnymi wiadomościami (tzn. ktoś klika dwa razy na kontakt, otwiera się nowa forma, następnie wysyła wiadomość przez poprzez przycisk wyślij i u odbiorcy po otrzymaniu wiadomości otwiera się forma z tą wiadomością). Okno u odbiorcy otwiera się ale od razu zawiesza i nie widać nic co zostało (jeżeli w ogóle zostało) otrzymane. Z góry dziękuje za jakąkolwiek pomoc. Poniżej 4 procedury (nasłuchu klientów, połączenia do klienta (przez double click na liście kontaktów), i klasa z obsługą odbierania i wysyłania:
NASŁUCH:
private void nasluchuj_klientow()
{
IPEndPoint lokalne = new IPEndPoint(IPAddress.Any, 2001);
klient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket accepted = null;
try
{
klient.Bind(lokalne);
klient.Listen(100);
while (true)
{
accepted = klient.Accept();
if (accepted.Connected)
{
wiadomosci = new Private(accepted );
AddItem("NASŁUCHANO KLIENTA");
}
}
}
catch (SocketException ex)
{
//MessageBox.Show("Wystąpił błąd " + ex);
}
}
POŁĄCZENIE:
private void podlacz_do(string ip)
{
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint kontakt = new IPEndPoint(IPAddress.Parse(ip), 2001);
try
{
s.Connect(kontakt);
if (s.Connected)
{
wiadomosci = new Private(s);
wiadomosci.Show();
AddItem("PODŁĄCZONO DO KIENTA");
}
}
catch(SocketException ex)
{
//MessageBox.Show("Wystąpił błąd " + ex);
}
}
KLASA PRIVATE:
...
public Private(Socket s)
{
InitializeComponent();
odbiorca = s;
Thread.Sleep(100);
odbieranie = new Thread(new ThreadStart(delegate { otrzymane(s); }));
odbieranie.IsBackground = true;
odbieranie.Start();
}
public void AddItem(string element)
{
if (this.listBox1.InvokeRequired)
{
AddItemCallback d = new AddItemCallback(AddItem);
this.Invoke(d, new object[] { element });
}
else
{
listBox1.Items.Add(element);
}
}
public void ShowMe()
{
if (this.InvokeRequired)
{
ShowMeCallBack d = new ShowMeCallBack(ShowMe);
this.Invoke(d, new object[] { });
}
else
{
this.Show();
}
}
private void wyslane(Socket odbiorca, string tekst)
{
try
{
if (tekst != "")
{
byte[] buffor = Encoding.UTF8.GetBytes(tekst);
odbiorca.Send(buffor);
tekst = "";
}
}
catch (SocketException ex)
{
AddItem("Wystąpił błąd: " + ex);
}
catch (ObjectDisposedException ex)
{
AddItem("Nie można połączyć z serwerem");
}
}
private void otrzymane(Socket nadawca)
{
byte[] msg = new byte[4000];
//string wiadomosc = "";
try
{
while (true)
{
nadawca.Receive(msg);
string wiadomosc = Encoding.ASCII.GetString(msg);
if (wiadomosc != "")
{
this.Show();
this.AddItem(wiadomosc);
}
wiadomosc = "";
wysylanie = new Thread(new ThreadStart(delegate { wyslane(nadawca, wiadomosc); }));
wysylanie.IsBackground = true;
wysylanie.Start();
}
}
catch (SocketException ex)
{
//AddItem("Wystąpił błąd: " + ex);
}
}
...