Cześć,
Od kilku dni uczę się programowania C# i napotkałem problem, na który nie potrafię znaleźć rozwiązania. Przeszukałem już trochę Internetu, ale stosując odnalezione tam porady nie udało mi się go rozwiązać, więc proszę Was o poradę bo może robię coś źle, albo w ogóle cała logika tego programu jest źle skontruowana..
Mianowicie, próbuję napisać prosty komunikator TCP, korzystam przy tym z wątków i całość można powiedzieć działa, ale nie potrafię w listbox'ie wyświetlić odebranej wiadomości. W klasie 'ConnectionThread' nie mogę się odwołać do listbox_status.. z klasy 'Form1'. Próbowałem też utworzyć nowy obiekt klasy 'Form1' w klasie 'ConnectionThread', jednak mimo że mogę się wtedy odwołać się do tego listbox'a, nic się w nim nie wyświetla.
Poniżej kod programu - zbędne rzeczy wyciąłem, w komentarzu zaznaczyłem co i gdzie chcę zrobić, proszę o jakieś sugestie bo już naprawdę nie wiem co jest tutaj źle..
Z góry, dzięki wielkie za pomoc :)
namespace proc_i_watki_serwer_TCP_komunik_
{
delegate void del2(string string_ip);
public partial class Form1 : Form
{
public static string ip_serwera;
public static int port_nasluchu;
public Form1()
{
InitializeComponent();
Thread adresacja = new Thread(new ThreadStart(pobierz_ip));
adresacja.Start();
}
public void pobierz_ip()
{
string string_ip;
IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
string_ip = ip.ToString();
if (label_ip.InvokeRequired)
{
del2 g = new del2(SetText2);
Invoke(g, new object[] { string_ip });
}
else
{
label_ip.Text = "IP: " + string_ip;
}
ip_serwera = ip.ToString();
}
}
}
private void SetText2(string string_ip)
{
label_ip.Text = "IP: " + string_ip;
}
public void button_wlacz_Click(object sender, EventArgs e)
{
Thread nasluchiwanie = new Thread(new ThreadStart(server));
int port_nas = (int)numeric_serwer_port.Value;
port_nasluchu = port_nas;
listBox_status.Items.Add(ip_serwera + ": " + port_nasluchu);
nasluchiwanie.Start();
}
else
{ //...
}
}
public void server()
{
ThreadedTcpSrvr server = new ThreadedTcpSrvr();
}
public class ThreadedTcpSrvr
{
private TcpListener client;
public ThreadedTcpSrvr()
{
client = new TcpListener(IPAddress.Parse(Form1.ip_serwera), Form1.port_nasluchu);
client.Start();
try
{
while (true)
{
while (!client.Pending())
{
Thread.Sleep(1000);
}
ConnectionThread newconnection = new ConnectionThread();
newconnection.threadListener = this.client;
Thread newthread = new Thread(new ThreadStart(newconnection.HandleConnection));
newthread.Start();
}
}
catch (ObjectDisposedException e)
{
}
}
}
public class ConnectionThread
{
public TcpListener threadListener;
public NetworkStream ns;
public StreamReader sr;
public TcpClient client;
public void HandleConnection()
{
client = threadListener.AcceptTcpClient();
ns = client.GetStream();
sr = new StreamReader(ns);
IPEndPoint clientep = (IPEndPoint)client.Client.RemoteEndPoint;
Thread odbior = new Thread(new ThreadStart(odbieranie));
odbior.Start();
}
public void odbieranie()
{
string responseData;
while (true)
{
responseData = sr.ReadLine();
if (responseData == null)
break;
// TUTAJ CHCIAŁEM WYŚWIETLIĆ W LISTBOX'IE TO CO OTRZYMAŁEM OD INNEGO HOSTA
//test.listBox_status.Items.Add(responseData); - TAK SIĘ NIE DA
}
ns.Close();
client.Close();
}
}
}