• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Shadowk1ller

[Duvida]Thread (Chat Servidor-Clientes)

5 mensagens neste tópico

Bem visto que no outro tópico estava a ficar muito "duvidoso" por minha parte decidi criar este no sitio certo (penso eu).

Bem as minhas dúvidas são as seguintes:

Qual a melhor maneira de se fazer com que no mesmo servidor se liguem mais que uma pessoa?

Como faço para a minha lista de utilizadores ligados ao sevidor apareça numa listbox ao lado?

Como posso fazer no servidor para poder dessa lista seleccionar um utilizador e Kicka-lo a partir dum botão a parte?

Desculpem se tiver a ser muito chato mas sou novo nisto e adorava que me ajuda-sem, eu quero me tornar grande nisto...:)

Desde já os meu muitíssimos obrigados a todos que me ajudaram e que espero que me ajudem...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual a melhor maneira de se fazer com que no mesmo servidor se liguem mais que uma pessoa?

- Ter uma thread a atender pedidos e assim que recebe um pedido despacha esse pedido para outra thread de modo a poder receber logo outro pedido de seguida.

Como faço para a minha lista de utilizadores ligados ao sevidor apareça numa listbox ao lado?

- Guardas os utilizadores ligados numa lista e tiras essa informação daí, sempre que essa lista muda, mudas o conteúdo da listBox.

Como posso fazer no servidor para poder dessa lista seleccionar um utilizador e Kicka-lo a partir dum botão a parte?

- O kick pode ser feito parando a thread que está a tratar esse "pedido" ou utilizador

tens alguma noção de programação concorrente? pedidos assíncronos? e uma thread ? (isto pra te poder ajudar melhor)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim tenho já chegamos a dar isso...desde já obrigado pela ajuda até agora dada...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem aqui está o meu servidor para o chat mas ainda não corre direito podiam-me dar uma luz aka ajudar ver erros?

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

namespace ChatGPSI50618e25
{
    public partial class Form1 : Form
    {
        private TcpListener tcpServer;
        private TcpClient tcpClient;
        private Thread th;
        private ChatDialog ctd;
        private ArrayList formArray = new ArrayList();
        private ArrayList threadArray = new ArrayList();
        public delegate void ChangedEventHandler(object sender, EventArgs e);
        public event ChangedEventHandler Changed;
        public delegate void SetListBoxItem(String str, String type); 

        public Form1()
        {
            InitializeComponent();

            // adiciona um ivento para cuidar para quando um cliente se liga
            Changed += new ChangedEventHandler(ClientAdded);

            // adiciona um no na treeview
            ListView linha;
            linha = lsusares.Items.Add("Clientes Ligados");
        }
        public void StartServer()
        {
            tbPortNumber.Enabled = false;
            th = new Thread(new ThreadStart(StartListen));
            th.Start();
        }

        public void StartListen()
        {

            IPAddress localAddr = IPAddress.Parse("127.0.0.1");

            tcpServer = new TcpListener(localAddr, Int32.Parse(tbPortNumber.Text));
            tcpServer.Start();

            // Continua a aceitar Clientes
            while (true)
            {
                Thread t = new Thread(new ParameterizedThreadStart(NewClient));
                tcpClient = tcpServer.AcceptTcpClient();
                t.Start(tcpClient);

            }

        }

        public void StopServer()
        {

            if (tcpServer != null)
            {

                // Fechar todas as ligaçoes por socket
                foreach (ChatDialog c in formArray)
                {
                    c.connectedClient.Client.Close();
                }

                // Abortar todas as Threads a correr
                foreach (Thread t in threadArray)
                {
                    t.Abort();
                }

                // limpar a lista de arrays
                threadArray.Clear();
                formArray.Clear();
                lsusares.Items[0].Items.Clear();

                th.Abort();
                tcpServer.Stop();
            }
            tbPortNumber.Enabled = true;
        }


        public void NewClient(Object obj)
        {
            ClientAdded(this, new MyEventArgs((TcpClient)obj));
        }

        public void ClientAdded(object sender, EventArgs e)
        {
            tcpClient = ((MyEventArgs)e).clientSock;
            String remoteIP = ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString();
            String remotePort = ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Port.ToString();

            // Chamar Função para actualizar a listview
            UpdateClientList(remoteIP + " : " + remotePort, "Add");

            // Mostra a caixa de dialogo
            ctd = new ChatDialog(this, tcpClient);
            ctd.Text = "Connected to " + remoteIP + "on port number " + remotePort;

            // Add Dialog Box Object to Array List
            formArray.Add(ctd);
            threadArray.Add(Thread.CurrentThread);
            ctd.ShowDialog();

        }

        private void UpdateClientList(string str, string type)
        {
            if (this.lsusares.InvokeRequired)
            {
                SetListBoxItem d = new SetListBoxItem(UpdateClientList);
                this.Invoke(d, new object[] { str, type });
            }
            else
            {
                if (type.Equals("Add"))
                {
                    this.lsusares.Items[0].Items.Add(str);
                }
                else
                {
                    foreach (TreeNode n in this.lsusares.Items[0].Items)
                    {
                        if (n.Text.Equals(str))
                            this.lsusares.Items.Remove(n);
                    }
                }

            }
        }

        private void lsusares_DoubleClick(object sender, System.EventArgs e)
        {
            int index = lsusares.SelectedItems.Index;

            if (!((ChatDialog)formArray[index]).Visible)
                ((ChatDialog)formArray[index]).Show();
        }

        public void DisconnectClient(String remoteIP, String remotePort) {

            UpdateClientList(remoteIP + " : " + remotePort, "Delete");

            int counter = 0;
            foreach (ChatDialog c in formArray)
            {
                String remoteIP1 = ((IPEndPoint)c.connectedClient.Client.RemoteEndPoint).Address.ToString();
                String remotePort1 = ((IPEndPoint)c.connectedClient.Client.RemoteEndPoint).Port.ToString();

                if (remoteIP1.Equals(remoteIP) && remotePort1.Equals(remotePort))
                {
                    break;
                }
                counter++;

            }

            ChatDialog cd = (ChatDialog)formArray[counter];
            formArray.RemoveAt(counter);

            ((Thread)(threadArray[counter])).Abort();
            threadArray.RemoveAt(counter);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                int port;
                port = Int32.Parse(tbPortNumber.Text);

                StartServer();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Insira uma porta correcta!");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            StopServer();
        }

        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }


    }
}

Deve ter erros muito disparatados e estúpidos mas como já disse dêem desconto sou novo nisto pedia o vosso contributo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

começa mas é a fazer debug a isso, tipo passo a passo a ver o que não estavas à espera que desse esse resultado.etc... coisas desse género....

toca a  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora