Jump to content
Sign in to follow this  
Bartude

Chat multithread

Recommended Posts

Bartude

Boas, eu tenho este programa que tirei deste site: http://vb.net-informations.com/communications/vb.net_chat_server_program.htm

E tipo, quero fazer algo do género, só que em vez de fazer na consola, queria fazer num formulário tipo a receber os dados numa listbox ou que. Não consigo alterar pk trabalhei muito pouco com sockets e isso, e nunca trabalhei com consolas e Hashtables. Se alguem puder ajudar, agradecia.

Obrigado

P.S.: Ja agora, se depois de resolverem este problema, souberem como fazer o servidor falar com os clientes tambem, era muito fixe. :thumbsup: Agradeço, a sério ^^

Share this post


Link to post
Share on other sites
bioshock

P.S.: Ja agora, se depois de resolverem este problema, souberem como fazer o servidor falar com os clientes tambem, era muito fixe. :D Agradeço, a sério ^^

Apanha-se cada anedota por aqui muito boa! :D

Share this post


Link to post
Share on other sites
Bartude

Pronto, sei que estou a pedir demasiado XD

Nao me culpem por nao saber mexer com consolas XD

Ja andei aqui a mexer, e pronto. Passei tudo o que tinha no Module para uma Form que eu criei. Só que dá me este erro: "Reference to a non-shared member requires an object reference."

É nesta linha: "msg("From client - " + clNo + " : " + dataFromClient)"

msg - É uma sub criada dentro da classe principal com 3 argumentos, só que isto esta a ser chamado noutra classe declarada dentro da classe principal.

Como resolvo isto?

Ja agora, desculpa por aquele primeiro post

Share this post


Link to post
Share on other sites
Bessa

Eu quero e ver o Porto "pk" sou Portista...Mas já agora, se alguém me pagasse o bilhete e a viagem de avião, era muito fixe! :D

Brincadeiras... :D

Oh Rapaz, ajudas ainda te dão como deram a mim, agora dar, nem o melhor fórum te dá programas feitos... :D

Share this post


Link to post
Share on other sites
Bartude

Eu sei, foi um erro muito grande meu pedir as cenas daquela maneira :x

Já pedi desculpas.

Share this post


Link to post
Share on other sites
cmd

Há threads fantásticas não há?!  :D

-----

@Bartude, porque é que passaste o que estava dentro do módulo para a form?


Cumps.cmd

Share this post


Link to post
Share on other sites
Bartude

Eu tive que passar o código todo do modulo para uma form doutro projecto, pk o projecto onde estava esse código originalmente, era um projecto de consola.

Eu passei o codigo dos dois projectos, para projectos novos, e ta a funcionar mais ou menos. Eu executo o servidor, executo o cliente, e conecto o cliente, só que não me esta a aparecer o formulário do servidor.

Share this post


Link to post
Share on other sites
Bartude

Desculpa la meter este codigo gigante :x

Se precisares que eu explique alguma para entenderes melhor, diz sff.

Imports System.Net.Sockets
Imports System.Text
Public Class Form1
    Dim clientsList As New Hashtable

    Sub msg(ByVal mesg As String)
        mesg.Trim()
        ListBox1.Items.Add(" >> " + mesg)
    End Sub

    Private Sub broadcast(ByVal msg As String, ByVal uName As String, ByVal flag As Boolean)
        Dim Item As DictionaryEntry
        For Each Item In clientsList
            Dim broadcastSocket As TcpClient
            broadcastSocket = CType(Item.Value, TcpClient)
            Dim broadcastStream As NetworkStream = broadcastSocket.GetStream()
            Dim broadcastBytes As [byte]()
            If flag = True Then
                broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg)
            Else
                broadcastBytes = Encoding.ASCII.GetBytes(msg)
            End If

            broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length)
            broadcastStream.Flush()
        Next
    End Sub

    Public Class handleClinet
        Inherits Form1
        Dim clientSocket As TcpClient
        Dim clNo As String
        Dim clientsList As Hashtable

        Public Sub startClient(ByVal inClientSocket As TcpClient, ByVal clineNo As String, ByVal cList As Hashtable)
            Me.clientSocket = inClientSocket
            Me.clNo = clineNo
            Me.clientsList = cList
            Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat)
            ctThread.Start()
        End Sub

        Private Sub doChat()
            Dim infiniteCounter As Integer
            Dim requestCount As Integer
            Dim bytesFrom(10024) As Byte
            Dim dataFromClient As String
            Dim sendBytes As [byte]()
            Dim serverResponse As String
            Dim rCount As String
            requestCount = 0
            For infiniteCounter = 1 To 2
                infiniteCounter = 1
                Try
                    requestCount = requestCount + 1
                    Dim networkStream As NetworkStream = clientSocket.GetStream()
                    networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
                    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"))
                    Call msg("From client - " + clNo + " : " + dataFromClient)

                    rCount = Convert.ToString(requestCount)

                    broadcast(dataFromClient, clNo, True)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try
            Next
        End Sub
    End Class

    Private Sub conectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles conectar.Click
        Dim serverSocket As New TcpListener(8888)
        Dim clientSocket As TcpClient
        Dim infiniteCounter As Integer
        Dim counter As Integer

        serverSocket.Start()
        msg("Chat Server Started ....")
        counter = 0
        infiniteCounter = 0
        For infiniteCounter = 1 To 2
            infiniteCounter = 1
            counter += 1
            clientSocket = serverSocket.AcceptTcpClient()

            Dim bytesFrom(10024) As Byte
            Dim dataFromClient As String

            Dim networkStream As NetworkStream = clientSocket.GetStream()
            networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
            dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
            dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"))

            clientsList(dataFromClient) = clientSocket

            broadcast(dataFromClient + " Joined ", dataFromClient, False)

            msg(dataFromClient + " Joined chat room ")
            Dim client As New handleClinet
            client.startClient(clientSocket, dataFromClient, clientsList)
        Next

        clientSocket.Close()
        serverSocket.Stop()
        msg("exit")
    End Sub

Share this post


Link to post
Share on other sites
Bartude

Esse sub serve para guardar a mensagem que os utilizadores escrevem. O trim é para "cortar" os espaços em branco à frente e atrás)

Share this post


Link to post
Share on other sites
Bartude

Andei aqui a ver, e isto esta a fazer uma coisa esquisita:

For Each Item In clientsList

Item é do tipo Dictionary

clientsList é do tipo Hashtable

Quando um cliente entra na sala, o seu nick é guardado na hashtable, só que quando um utilizador escreve alguma coisa, o Count to hashtable é igual a 0. Mas se outro utilizador entrar na sala, o count sobe mais um como deve de fazer.

Alguma coisa esta me a por o hashtable a 0 quando alguem escreve alguma coisa :x

Share this post


Link to post
Share on other sites
Bartude

Boas, ja consegui mudar o código para o meu programa, e esta a correr quase tudo como eu quero. Só que agora é aquilo que falei no 1º post :x

Os clientes podem falar entre si à vontade, só que eu agora queria fazer o servidor falar com eles. Só que no lado do servidor nem consigo carregar no formulário, porque aquilo "freeza" o form.

Alguém tem alguma ideia do porque isto acontecer??

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.