Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [VB.NET] Winsock: Problema con porta in ascolto

    Ciao a tutti, sto sviluppando un'applicazione per la contabilità generale in piu punti vendita.
    Vorrei poter connettere i computer nei vari punti vendita attraverso la connessione TCP/IP.

    Lato Server: devo mettere in ascolto una porta del PC e questo lo faccio utilizzando un controllo .OCX (Microsoft Winsock Control).
    Il problema è che utilizzando il seguente codice:
    codice:
    axWinsock1.Localport=2000
    axWinsock1.Listen
    La porta dovrebbe essere in ascolto.

    Adesso verifico lo stato delle porte mediante il comando:
    NETSTAT -NAP TCP
    dal promt dei comandi, e mi viene fornita la lista delle porte in ascolto e il loro stato.
    La porta 2000 dovrebbe risultare con uno stato "Listening" invece non appare per niente.

    Sbaglio qualcosa?

    Lato client: Sempre attraverso l'utilizzo dello stesso controllo OCX il codice per la connessione è il seguente:
    codice:
    axWinsock1.Connect(192.168.28.3 , 2000)
    La stranezza è che se eseguo il codice sopra indicato sia sul Server che sul Client, impostando la stessa porta non viene generato nessun errore ma continuo a non vedere la connessione "establishment" ma riesco a vederla solo sul client in stato di "Porta in chiusura".

    Mi rendo conto di non essere stato eccessivamente chiaro nella spiegazione del problema,
    per ulteriori approfondimenti rimango in ascolto

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma con il VB.NET perche' usi ancora degli ocx di VB6?

    Usa le classi apposite del framework ... TCPListener e TCPClient ...

    Per i problemi di collegamento, dall'IP (192.168.28.3) si capisce che sei in una LAN ... quindi si parla di "punti vendita" nello stesso "centro commerciale" o comunque in LAN?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ma con il VB.NET perche' usi ancora degli ocx di VB6?
    Perchè non ho molta esperienza riguardo la programmazione e le reti.

    Da tempo sto studiando vb.net e i database (SQL server e Access) così ho sviluppato un'applicazione per il controllo della contabilità generale.

    Cerco di spiegarti lo scenario perchè avere un tuo consiglio oltre ad essere un vero piacere mi sarebbe anche d' aiuto.

    Ci sono circa 10 computer connessi in rete LAN all'interno dello stesso edificio ( un Villaggio turistico ) e questi lavorano acquisendo e scrivendo i dati tutti nello stesso DB posizionato in uno dei dieci.

    Adesso vorrei implementare funzionalità simili a Chat e trasferimento dei file tra i vari computer (ripeto connessi tramite LAN) utilizzando il protocollo TCP/IP così ho provato con Winsock.OCX ma con i problemi sopra citati (adesso proverò l'uso dei controlli disponibili per .NET e, spero di no in caso di problemi ti farò sapere, comunque ho visto che c'è molto materiale in rete).

    In effetti però, in futuro sarà molto probabile che sia necessario connettersi con un computer in remoto per il traferimento dei file (anche per la lettura dei database) oltre che il solito sistema di "Chat".

    Domanda : Come posso connettermi ad un computer remoto per le funzionalità appena indicate?
    Per quanto concerne la lettura dei database a distanza pensavo a documenti xml, secondo te è corretto (comunque rimane il problema della connessione)

    Non chiedo codice (almeno all'inizio) perchè mi piace capire "il più da solo possibile diciamo" ma vorrei poter essere indirizzato!

    Grazie in anticipo per l'aiuto fornito.
    Ciao

  4. #4
    oregon e altri lettori, ho cercato un pò nel Help Microsoft e dato il mio problema (ovvero la prospettiva di una connessione ad un computer remoto) ho pensato di far comunicare i pc nella LAN attraverso le classi TCPListener e TCPClient e di far comunicare il server con l'esterno attraverso gli oggetti e i metodi esposti su quest'articolo QUI per quanto concerne la creazione dell'applicazione Server e in quest'articolo QUI per il Client.

    Una volta avviata l'applicazione server, tutto Ok, nel senso che la porta viene messa in ascolto. poi avvio l'applicazione client e nella seguente riga di codice viene generato l'errore sotto riportato

    codice:
    Obj = CType(Activator.GetObject(Type.GetType("myRemoteClass, ServerClass"), "tcp://localhost:8085/RemoteTest"), myRemoteClass)
    Errore 5:
    codice:
    Nome parametro : Type()
    Il valore non può essere null.
    Per ore mi sono scervellato, niente secondo te dov'è il problema.

    Ciao

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Pensavo volessi solamente scambiare dati in rete (namespace System.Net) e non attivare oggetti remotamente (cosa piu' complessa e forse inutile per quello che devi fare).

    Per il problema specifico, hai avviato il server e il client nello stesso computer?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    si ho testato tutto nello stesso computer.

    Comunque hai capito bene, i dati devono essere scambiati in rete, poi altri dati devono essere scambiati tra computer remoti.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma "quanti" dati devono essere scambiati e quanto "frequentemente"?

    Se si tratta di avere un DB remoto disponibile, allora e' meglio installare il DBMS nel server remoto e collegarsi come un normale client.

    Se devi scambiare file allora puo' andare bene FTP (o altri protocolli).

    Se sono semplici stringhe allora un collegamento con Winsock (TCPClient/TCPListener) puo' bastare ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Ok per i computer nella LAN utilizzo TCPListner e TCClient, facilissimi da usare ho gia scritto il codice e tutto funziona.

    (Adesso non sono nel mio computer stasera, per rendere più utile questa discussione posto il codice che utilizzo per gli oggetti TCPListner e TCPClient che utilizzo per la connessione)

    DOMANDA: Non essendo esperto mi chiedo una cosa:
    Posso utilizzare TCPListner e TCClient per far comunicare (anche solo stringhe di testo)
    computer remoti?

    Per quanto riguarda il trasferimento di file FTP non è poi così performante, per questo motivo pensavo ad altri sistemi.

    Ciao e grazie

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da marcotavoloni
    DOMANDA: Non essendo esperto mi chiedo una cosa:
    Posso utilizzare TCPListner e TCClient per far comunicare (anche solo stringhe di testo)
    computer remoti?
    Sicuramente. Dal punto di vista del codice non dovrebbe cambiare nulla. Ci sono degli aspetti piu' "sistemistici" (di architettura di rete) che pero' devono essere valutati solo dopo che hai dato dettagli maggiori sui sistemi coinvolti e sul loro collegamento.

    Per quanto riguarda il trasferimento di file FTP non è poi così performante
    Insomma ... veramente, per i file, e' uno dei protocolli che rendono di piu' ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Posto il codice che utilizzo per connettere due computer con TCPListner e TCPClient, cercando di rendere questo thread più utile per tutti

    Lato Server:
    1.Genera un form
    2.Inserisci un Button (.Text=Ascolta)
    3.Inserisci una Textbox

    codice:
    Imports System
    Imports System.IO
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
    Imports Microsoft.VisualBasic
    
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Control.CheckForIllegalCrossThreadCalls = False
            Dim Th As New Threading.Thread(AddressOf Ascolta)
            Th.SetApartmentState(Threading.ApartmentState.STA)
            Th.Start()
    
        End Sub
    
        Sub Ascolta()
    
            Dim server As TcpListener
            server = Nothing
            Try
    
                'Imposta la porta
                Dim port As Int32 = 2000
                Dim localAddr As IPAddress = IPAddress.Parse("000.000.00.0")
            
                server = New TcpListener(localAddr, port)
    
                ''Avvia l'apertura della porta "2000"
                server.Start()
    
                ' Buffer per la lettura dei dati
                Dim bytes(1024) As Byte
                Dim data As String = Nothing
    
                ' Avvio il ciclo per la connessione
                While True
    
                    TextBox1.Text += "Attendo la connessione..." & vbCrLf
    
                    'Accetto la connessione
                    Dim client As TcpClient = server.AcceptTcpClient()
    
                    TextBox1.Text += "Connesso!" & vbCrLf
    
                    data = Nothing
    
                    'Oggetto canale per la ricezione e l'invio
                    Dim stream As NetworkStream = client.GetStream()
    
                    Dim i As Int32
    
                    'Ricevo i dati inviati dal client
                    i = stream.Read(bytes, 0, bytes.Length)
    
                    While (i <> 0)
    
                        'Converto i dati da bytes a ASCII.
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
                        TextBox1.Text += "Ricevuti: " & data & vbCrLf
    
                        'Analisi dei dati inviati dal client
                        data = data.ToUpper()
                        Dim msg As Byte() = System.Text.Encoding.ASCII.GetBytes(data)
    
                        'Invio la risposta al client
                        stream.Write(msg, 0, msg.Length)
                        TextBox1.Text += "Inviato: " & data & vbCrLf
                        i = stream.Read(bytes, 0, bytes.Length)
    
                    End While
    
                    'Chiudo la connessione
                    client.Close()
    
                End While
    
            Catch ex As SocketException
    
                TextBox1.Text += "SocketException: " & vbCrLf
    
            Finally
    
                server.Stop()
    
            End Try
        End Sub
    
    End Class
    Lato Client:
    1.Genera un form
    2.Inserisci un Button (.Text=Connetti)
    3.Inserisci una Textbox

    codice:
    Imports System
    Imports System.IO
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
    Imports Microsoft.VisualBasic
    
    Public Class Form1
    
          Sub Connect(ByVal server As [String], ByVal message As [String])
    
            Try
    
                'Creazione dell'oggetto client
                Dim port As Int32 = 2000
                Dim client As New Sockets.TcpClient(server, port)
    
                'Converto il messaggio passato come ASCII e lo memorizzo in un array 
                Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message)
    
                'Avvio un canale per inviare e ricevere
                Dim stream As NetworkStream = client.GetStream()
    
                'Invio un messaggio al server connesso 
                stream.Write(data, 0, data.Length)
    
                TextBox1.Text += "Inviato: " & message & vbCrLf
    
                'ricevo la risposta del server e la memorizzo nel buffer
                data = New [Byte](256) {}
    
               Dim responseData As [String] = [String].Empty
    
                'Leggo la risposta del server tcp
                Dim bytes As Int32 = stream.Read(data, 0, data.Length)
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
                TextBox1.Text += "Ricevuto: " & responseData & vbCrLf
    
                'Chiudo il canale e la connessione tcp
                stream.Close()
                client.Close()
    
            Catch ex As ArgumentNullException
                TextBox1.Text += "ArgumentNullException: " & ex.Message & vbCrLf
            Catch ex As Net.Sockets.SocketException
                TextBox1.Text += "SocketException: " & ex.Message & vbCrLf
            End Try
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Connect("000.000.00.0", "Ciao")
    
        End Sub

    In Internet si trova una marea di materiale circa l'utilizzo di questi oggetti, se avete consigli sul codice scritto (ovviamente le funzionalità così sono molto ridotte, infatti non è possibile nemmeno scegliere l'Ip del server o la porta ma è molto semplice modificare questo codice per implementarlo) dite pure.

    Per quanto riguarda la connessione FTP, ho scritto che non è molto performante

    Citazione:
    Per quanto riguarda il trasferimento di file FTP non è poi così performante
    Insomma ... veramente, per i file, e' uno dei protocolli che rendono di piu' ...
    perchè evidentemente sbaglio qualcosa.

    Ma per fare l'upload di un file mdb di modeste dimensioni (Basti pensare ad una sola tabella con 10 colonne (contatore, numeric e string) e solo qualche riga scritta potrebbe passare anche qualche minuto.

    Stasera penso di essere alla frutta, domani vi posto il codice.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.