System.Net.Sockets - prosty komunikator

0

Witam! Próbuję napisać prosty komunikator, za wzór używam tego kodu: http://csharp.net-informations.com/communications/csharp-server-socket.htm
Niestety przy linijce zdefiniowania klienta aplikacja dalej nie rusza... Próbowałem 2 metodami, tak jak jest tam na stronie i normalnie od razu client = server.AcceptTcpClient(); bez tego default i to samo :( To chyba wina tego adresu, nie wiem czy to dobrze zrobiłem. Jest konsktruktor z samym portem, niestety VS wywala błąd obselete, że jest przestarzały i żeby użyć ze IPAddress. Proszę o pomoc, to mój kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        public static string Time()
        {
            return System.DateTime.Now.Hour.ToString() + ":" + System.DateTime.Now.Minute.ToString() + ":" + System.DateTime.Now.Second.ToString();
        }
        static void Main(string[] args)
        {
            byte[] bip = { 127, 0, 0, 1 };
            System.Net.IPAddress ip = new System.Net.IPAddress(bip);
            System.Net.Sockets.TcpListener server = new System.Net.Sockets.TcpListener(ip, 1024);
            System.Net.Sockets.TcpClient client = default(System.Net.Sockets.TcpClient);
            server.Start();
            Console.WriteLine(Time() + " >> Server started");
            client = server.AcceptTcpClient(); //tu koniec, aplikacja działa, ale nie reaguje

            if (client.Connected)
            {
                Console.WriteLine(Time() + " >> Client connected");
                //tu miała być reszta, ale zatrzymałem się przy tamtym :(
            }
        }
    }
}

0

AcceptTcpClient() jest metodą blokującą - dopóki się do serwera nie podłączy klient, dopóty aplikacja "nie pójdzie" dalej, tylko tam będzie stać.

0

Acha, czyli jest OK, tylko teraz muszę napisać klienta i jak się podłączy to pójdzie dalej? I jeszcze trochę nie rozumiem po co w serwerze klient, chyb a klient ma być z zewnątrz a nie tu i tu, tzn. ja się nie znam, ale fajnie jak by ktoś wytłumaczył dlaczego tu i tu musi być.

0

No jasne że są osobno, o co chodzi?
Serwer czeka na jakieś połączenie na okreslonym porcie i adresie IP; wobec czego musisz napisać klienta który właśnie na tym porcie się podłączy xd (wykona Connect())

A gdy już ktoś to zrobi, to musisz jakoś zarządzać tym podłączonym klientem - dlatego właśnie masz TcpClient - gdy np. piszesz chat, masz listę TcpClientów, do których piszesz wiadomości etc.

0

Mam teraz jeszcze pytanie, jak zapobiec błędom w kliencie, gdy serwer się rozłączy? client.Connected zawsze daje true po połączeniu nawet, gdy client już się odłączył i przez to mam błędy. Jak rozwiązać ten problem?

0

Obsługa wyjątków, try i catch ?

0

Nie o exception mi chodziło, a o zwykłe bugi. Po rozłączeniu klient dostaje miliony pustych wiadomości albo się crashuje ;/

0

Dobrze powiedział ponieważ gdy rozłączasz klienta połączenie jest zerwane i następuje błąd który przechwycisz.

Ten twój crash to przerwanie połączenia.

0

Wyjątek zapobiegł crash'owi. Teraz tylko jak zaradzić tym pustym wiadomościom? Dalej je dostaje przy programowym zamknięciu serwera ;/

EDIT:
Już z wiadomościami też sobie poradziłem. Po prostu zamykam aplikację i nie bawię się w jakieś zamykanie socket'ów.

0

co to za komunikator na 2 osoby :).

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