Moment połączenia klienta z serwerem

0

Witam

Mam pytanko. W którym momencie serwer "wie" ze jakoś klient podłącza się do niego, czy po wysłaniu pierwszych danych czy wcześniej? Chodzi o to że piszę aplikację klient- serwer za pomocą socketów i nie wiem w którym momencie utworzyć nowy wątek obsługujący nowego klienta.

pozdrawiam

0

Serwer czeka na polaczenie (znaczy wisi zwykle w tym momencie) i zwykle 'wywolanie czekania' konczy sie w momencie polaczenia. Czyli w pseudokodzie zwykle wyglada to tak:

dopoki serwer_dziala
{
  czekaj_na_polaczenie();
  stworz_nowy_watek(); //skoro tutaj jest to znaczy, ze sie doczekal.
}
0

Zrobiłem coś takiego:

IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 8000);
            Socket newsock = new Socket(AddressFamily.InterNetwork,
                               SocketType.Stream, ProtocolType.Tcp);
            newsock.Bind(localEndPoint);
            newsock.Listen(10);

            while (true)
            {
                client = newsock.Accept();
                if (client.Connected == true)
                {
                    Thread wątek = new Thread(new ThreadStart(obsługa_klienta));
                    wątek.Start();
                }
            }
public void obsługa_klienta()
        {
            NetworkStream strumień = new NetworkStream(client);
            StreamReader czytanie = new StreamReader(strumień);
            StreamWriter pisanie = new StreamWriter(strumień);
            while (true)
            {
                string napis = czytanie.Read().ToString();
                MessageBox.Show(napis);

            }
        }

i niestety po wysłaniu od klienta jakiegoś komunikatu serwer nic ni odbiera. w czym może tkwić błąd??

z góry dzięki za pomoc

0

A co na to debugger? Ktora linijka wydaje sie byc problemem?

0

Program po natrafieniu na tą linię kodu:

string napis = czytanie.Read().ToString();

oczekuje na odbiór danych a jak wysyłam coś z klienta to nic się nie dzieje

0

Jak wysylasz?

0

Połączenie:

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10000);
            server = new Socket(AddressFamily.InterNetwork,
                              SocketType.Stream, ProtocolType.Tcp);
            server.Connect(ipep);
            strumień = new NetworkStream(server);
            czytanie = new StreamReader(strumień);
            pisanie = new StreamWriter(strumień);

I wysyłanie:

pisanie.Write("hej");

0

No to przeciez na inny port wysylasz ;) Otwierasz do sluchania 8000, wysylasz 10000. To MA znaczenie. Sprawdzic mozesz rowniez komenda 'telnet', bez pisania drugiej strony.

0

Port to później zmieniłem po obu stronach mam ten sam więc to nie jest tego wina. A tym telnetem to jak sprawdzić bo nigdy tego nie robiłem.

0

Wchodzisz w linie polecen:

telnet localhost port

//edit
Twoj kod serwera dziala, dane z telneta sa odbierane.

0

Więc w czym może tkwić problem bo ja już nie wiem czego mam się chwycić.

0

Problem z czym? Na oryginalne pytanie sobie juz odpowiedziales - kod nasluchujacy, ktory przedstawiles, dziala.

0

Ok ale nie wiem dlaczego ni odbiera danych od klienta. Czy możesz spojrzeć na jego kod i ewentualnie powiedzieć co jest nie tak??

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10000);
            server = new Socket(AddressFamily.InterNetwork,
                              SocketType.Stream, ProtocolType.Tcp);
            server.Connect(ipep);
            strumień = new NetworkStream(server);
            czytanie = new StreamReader(strumień);
            pisanie = new StreamWriter(strumień);
            Odczytywanie_komunikatów.RunWorkerAsync();

private void button1_Click(object sender, EventArgs e)
        {
            string dane = "hej";
            pisanie.WriteLine(dane);
            
           
        }

Z góry dzięki

0

Nie lubie jak ktos nie czyta odpowiedzi, wiesz? 2x napisalem, ze ODBIERANIE danych dziala, bo dziala na telnecie. Raczylbys sprawdzic...

Kod, ktory u mnie dziala, lekko zmodyfikowane Twoje 2 programy:
odbieranie:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace console_test
{
	class Program
	{
		protected Socket client;

		static void Main(string[] args)
		{
			new Program().run();
		}

		public void run()
		{
			IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 8000);
			Socket newsock = new Socket(AddressFamily.InterNetwork,
												 SocketType.Stream, ProtocolType.Tcp);
			newsock.Bind(localEndPoint);
			newsock.Listen(10);

			while (true)
			{
				client = newsock.Accept();
				if (client.Connected == true)
				{
					Thread wątek = new Thread(new ThreadStart(obsługa_klienta));
					wątek.Start();
				}
			}
		
		}
		public void obsługa_klienta()
		{
			NetworkStream strumień = new NetworkStream(client);
			StreamReader czytanie = new StreamReader(strumień);
			StreamWriter pisanie = new StreamWriter(strumień);
			while (true)
			{
				string napis = czytanie.Read().ToString();
				Console.WriteLine(napis);

			}
		}		
	}
}

Wysylanie:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main(string[] args)
		{
			IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000);
			Socket server = new Socket(AddressFamily.InterNetwork,
												SocketType.Stream, ProtocolType.Tcp);
			server.Connect(ipep);
			NetworkStream strumien = new NetworkStream(server);
			StreamWriter pisanie = new StreamWriter(strumien);
			pisanie.WriteLine("abc");
			pisanie.Close();
			server.Disconnect(false);
		}
	}
}

Wystarczy tylko wiedziec jak wyglada komunikacja klient/serwer i testowac na sprawdzonych rozwiazaniach (np. telnet na 100% dobrze wysyla) zanim sie zacznie pisac button1_Click, itp.

0

Dzięki bardzo jestem wdzięczny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1