Multi Chat

di il
9 risposte

Multi Chat

Ciao a tutti, uso questo sistema dove posto il codice per parlare in chat nella stessa rete tra client e server, vorrei se possibile usare un multi-client e rispondere sempre con il server, ovvero:

client 1 scrive a Server

client 2 scrive a server

client 3 scrive a server

Server risponde a client 1 o 2 o 3 in base alle esigenze…. questo è quello che vorrei fare.

Codice per SERVER:

Imports System.IO
Imports System.Net.Sockets
Imports System.Text.UTF8Encoding
Public Class Form1
    Dim listener As TcpListener
    Dim client As TcpClient
    Dim stream As NetworkStream
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        listener = New TcpListener(25565)
        listener.Start()
        Timer1.Start()
    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        If client.Available > 0 Then
            Dim x(client.Available - 1) As Byte
            stream.Read(x, 0, x.Length)
            Dim text As String = UTF8.GetString(x)
            TBricevi.Text = TBricevi.Text & text & vbCrLf
        End If
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If listener.Pending = True Then 'se l'ascoltatore è in ascolto
            Timer1.Stop()
            client = listener.AcceptTcpClient 'accetta la connessione del TcpClient
            listener.Stop() 'smette di ascoltare
            stream = client.GetStream 'ottiene il flusso di dati
            Timer2.Start() 'avvia il timer2 che legge il flusso dati e lo converte in testo
            TBricevi.Text = TBricevi.Text & "Connessione effettuata" & vbCrLf
        End If
    End Sub

    Private Sub BTNinvia_Click(sender As Object, e As EventArgs) Handles BTNinvia.Click
        Dim y() As Byte = UTF8.GetBytes("<SERVER>: " & TBInvio.Text) 'il Tag SERVER serve per sapere chi scrive
        stream.Write(y, 0, y.Length)
        TBricevi.Text = TBricevi.Text & TBInvio.Text & vbCrLf
        TBInvio.Clear()
    End Sub
End Class

Codice per Client:

Imports System.Net.Sockets
Imports System.Text.UTF8Encoding
Public Class Form1
    Dim client As TcpClient
    Dim stream As NetworkStream
    Private Sub BTNconnetti_Click(sender As Object, e As EventArgs) Handles BTNconnetti.Click
        Dim address As Net.IPAddress
        Net.IPAddress.TryParse(TBip.Text, address)
        client = New TcpClient
        client.Connect(address, 25565)
        If client.Connected Then
            stream = client.GetStream
            Timer1.Start()
            TBricevi.Text = TBricevi.Text & "Connessione Effettuata" & vbCrLf
        Else
            TBricevi.Text = TBricevi.Text & "Non Connesso" & vbCrLf
        End If
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If client.Available > 0 Then
            Dim x(client.Available - 1) As Byte
            stream.Read(x, 0, x.Length)
            Dim text As String = UTF8.GetString(x) 'trasforma da Byte a testo
            TBricevi.Text = TBricevi.Text & text & vbCrLf
        End If
    End Sub

    Private Sub BTNinvia_Click(sender As Object, e As EventArgs) Handles BTNinvia.Click
        Dim y() As Byte = UTF8.GetBytes("<CLIENT>: " & TBinvia.Text) 'trasforma da testo a Byte e il Tag CLIENT specifica chi scrive
        stream.Write(y, 0, y.Length)
        TBricevi.Text = TBricevi.Text & TBinvia.Text & vbCrLf
        TBinvia.Clear()
    End Sub


End Class

Secondo voi, come potrei gestire le connessioni in entrata se apro una nuova chat? ho provato creando un nuovo client e chiudendo il Client ma ovviamente così non è  e credo di dover chiudere anche nel server.

Potete indicarmi qualcosa?

Grazie

9 Risposte

  • Re: Multi Chat

    Devi usare i thread.

    Il colloquio tra un client e il server lo affidi ad un nuovo thread nel server.

  • Re: Multi Chat

    Ciao Oregon, intendi un po come funzionanoni forum quindi, dove però le discussioni non sono private, io invece vorrei che le comunicazioni tra ogni singolo client e il server siano private… forse se spiego cosa debo fare è piu facile.

    Ho un piccolo B&B da 5 stanze e volevo mediante questa idea di chat, gestire le problematiche eventuali, poi magari creo de Button con problematiche preimpostate… vorrei che quando da una stanza mi mandano il problema io abbia la facoltà di leggerlo e magari se necessario rispondere ma ovviamente sarebbero conversazioni private.

  • Re: Multi Chat

    08/04/2023 - orione1976 ha scritto:


    … intendi un po come funzionano i forum quindi

    No, assolutamente no.
    Oregon intendeva i thread che può creare un processo.
    Il tuo programma EXE che andrai a creare sarà il processo, e ad ogni chat privata che un client andrà a richiedere, il tuo programma creerà un thread che si occuperà di scambiare i messaggi tra il server e la stanza relativa del tuo B&B (quindi solo messaggi privati).

    Una volta terminata la chat, il thread relativo verrà distrutto.

  • Re: Multi Chat

    Ah ok perfetto quindi è proprio quello che vorrei… adesso devo studiare la realizzazione quindi… se avete qualche riferimento me lo studio, intanto faccio d3lle ricerche in merito ense riewco butto giù quqlcosa vediamo che ne esce fuori.

  • Re: Multi Chat

    Basta studiare quello che riguarda la programmazione multithreading

    Inutile cercare noi quello che puoi cercare e studiare da solo. Ti consiglio dei libri, l'argomento non è banale

  • Re: Multi Chat

    La soluzione che ti ha dato Oregon è ovviamente la più giusta e corretta, e ti serve per imparare cose nuove, comunque se vuoi risolvere il problema in modo facile, visto che il programma (da quel che ho capito) è solo per te, e che le stanze sono sicuramente 5, non di più, non di meno, potresti creare 5 oggetti TcpListener (e se vuoi farli lavorare su 5 porte diverse), e poi dentro ai timer fai un ciclo FOR e li testi tutti e 5, decidendo poi cosa fare.


    Altra domanda: come fai poi a capire quando la connessione cade ??

  • Re: Multi Chat

    10/04/2023 - SirJo ha scritto:


    La soluzione che ti ha dato Oregon è ovviamente la più giusta e corretta, e ti serve per imparare cose nuove, comunque se vuoi risolvere il problema in modo facile, visto che il programma (da quel che ho capito) è solo per te, e che le stanze sono sicuramente 5, non di più, non di meno, potresti creare 5 oggetti TcpListener (e se vuoi farli lavorare su 5 porte diverse), e poi dentro ai timer fai un ciclo FOR e li testi tutti e 5, decidendo poi cosa fare.


    Altra domanda: come fai poi a capire quando la connessione cade ??

    ok vedo che posso fare visto che è una cosa per me, ora studio quanto mi avete detto e vediamo, per la connessione che cade…. ci stavo pensando, devo risolvere un problema alla volta altrimenti mi perdo… però ci stavo pensando e sono sicuro che almeno quello riesco a risolverlo in tempi piu brevi…

  • Re: Multi Chat

    Eccoti una estensione per il TcpClient per testare lo stato di connessione

    basta che fai
    Dim stato = client.GetState()
    e così controlli lo stato della connessione

    Imports System.Net.Sockets
    Imports System.Net.NetworkInformation
    
    Module TcpClientExtension
    
        <System.Runtime.CompilerServices.Extension()> _
        Public Function GetState(tcpCli As TcpClient) As TcpState
            Dim tcpConn = IPGlobalProperties.GetIPGlobalProperties.GetActiveTcpConnections
    
            For Each conn In tcpConn
                If conn.LocalEndPoint.Equals(tcpCli.Client.LocalEndPoint) And conn.RemoteEndPoint.Equals(tcpCli.Client.RemoteEndPoint) Then
                    Return conn.State
                End If
            Next
    
            Return TcpState.Unknown
    
        End Function
    
    End Module
    
  • Re: Multi Chat

    Ok grazie… mi hai tolto un pensiero… grazie ancora

Devi accedere o registrarti per scrivere nel forum
9 risposte