Sockety, wysyłanie wiadomości

0

Cześć,
próbuję sobie stworzyć prosty czat pomiędzy klientem, a serwerem (z tego poradnika Gniazda sieciowe). Korzystam z TcpClient i mam pewien problem. Otóż mam sobie 3 formy - w jedna forma z dwoma przyciskami - klient i serwer, które otwierają odpowiednie formy. Otwieram klienta, a potem serwer i pojawia się wiadomość, że połączono. Problem w tym, że gdy chcę wysłać kolejną wiadomość to ona... się nie wysyła.

Serwer.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;

namespace TPC_Client
{
    public partial class Serwer : Form
    {
        public Serwer()
        {
            InitializeComponent();
            Thread watek = new Thread(CreateServer);
            watek.Start();
        }

        void CreateServer()
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1024);
            listener.Start();
            TcpClient newClient = listener.AcceptTcpClient();
            BinaryReader reader = new BinaryReader(newClient.GetStream());
            if(listBox1.InvokeRequired)
            {
                listBox1.Invoke(new MethodInvoker(delegate
                {
                    listBox1.Items.Add(reader.ReadString());
                }));
            }
        }
    }
}

Klient.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;

namespace TPC_Client
{
    public partial class Klient : Form
    {
        TcpClient externalClient;
        BinaryWriter writer;
        //Thread watek;

        public Klient()
        {
            InitializeComponent();
            Client();
        }

        void Client()
        {
            externalClient = new TcpClient();
            if(externalClient.Connected == false)
            {
                externalClient.Connect("127.0.0.1", 1024);
                writer = new BinaryWriter(externalClient.GetStream());
                writer.Write("Nawiązano połączenie");
                writer.Write(12345.15);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            writer.Write("Próba wysłania wiadomości"); //to nie działa
        }
    }
}
0

A ta wiadomość się pojawia? writer.Write(12345.15);

Czytasz tu pierwszy string który przyjdzie

void CreateServer()
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1024);
            listener.Start();
            TcpClient newClient = listener.AcceptTcpClient();
            BinaryReader reader = new BinaryReader(newClient.GetStream());
            if(listBox1.InvokeRequired)
            {
                listBox1.Invoke(new MethodInvoker(delegate
                {
                    listBox1.Items.Add(reader.ReadString());
                }));
            }
        }

I co dalej? Wychodzi z metody, i już nigdy więcej jej nie uruchamiasz.

0

Tą linijkę niepotrzebnie wkleiłem.

writer.Write(12345.15);

Aczkolwiek w ciągu dalszym nie wiem dlaczego mogę wysłać kolejnej wiadomości do serwera

private void button1_Click(object sender, EventArgs e)
        {
            writer.Write("Próba wysłania wiadomości");
        }

Dlaczego powyższy kod nie działa? Klikam przycisk i nic się nie dzieje...

0

No przecież napisałem, serwer odbiera tylko jedną wiadomość, dalej już nie nasłuchuje.

0

A co zrobić żeby on cały czas nasłuchiwał?

0

Nie wiem, możesz spróbować jakoś tak:

bool isWorking = true;
void CreateServer()
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1024);
            listener.Start();
            TcpClient newClient = listener.AcceptTcpClient();
            while(isWorking)
           {
            BinaryReader reader = new BinaryReader(newClient.GetStream());
            if(listBox1.InvokeRequired)
            {
                listBox1.Invoke(new MethodInvoker(delegate
                {
                    listBox1.Items.Add(reader.ReadString());
                }));
            }}
        }

Poszukaj lepszego tutoriala, ten jest jakiś biedny.

0

Kod za bardzo nie działa, okienko z aplikacją dostaje laga, tzn nic nie można zrobić.
Polecisz może jakiś tutorial z dobrze opisanymi socketami?

0

Jak okienko przestaje odpowiadać, to oznacza, że musisz nasłuchiwanie serwera zrobić w oddzielnym wątku, a nie wątku GUI.

0

No cały czas jest w wątku, tworzę go w konstruktorze

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;

namespace TPC_Client
{
    public partial class Serwer : Form
    {
        //bool isWorking = true;
        public Serwer()
        {
            InitializeComponent();
            Thread watek = new Thread(CreateServer);
            watek.Start();
        }

        void CreateServer()
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1024);
            listener.Start();
            TcpClient newClient = listener.AcceptTcpClient();
            while (true)
            {
                BinaryReader reader = new BinaryReader(newClient.GetStream());
                if (listBox1.InvokeRequired)
                {
                    listBox1.Invoke(new MethodInvoker(delegate
                    {
                        listBox1.Items.Add(reader.ReadString());
                    }));
                }
            }
        }
    }
}
0

pomoże ktoś? :p

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