Socket tra applicazioni

di il
11 risposte

Socket tra applicazioni

Salve a tutti del forum,
in questo periodo sono alle prese con le comunicazioni mediante le socket.

In Java tutto funziona alla perfezione (tra esempi e materiali trovati su internet) e ho fatto due prg sample (uno Client e uno Server) per farli semplicemente dialogare ed è tutto OK.

Ho applicato gli stessi concetti, anche se con comandi differenti, ad altri due semplici prg fatti in VB6 (Client/Server) e tra loro è tutto ok.

Teoricamente dovrebbe essere possibile far dialogare un prgClient di VB6 con un prgServer di Java.
Ho fatto delle prove ma sembra non funzionare.

Da qui la mia domanda: Far comunicare due prg sviluppati con linguaggi differenti è possibile ? Se si, in questi casi bisogna far attenzione a qualcosa o sviluppare l'applicazione in un modo differente rispetto al normale ?

Grazie a tutti per aver letto, ancor di più se mi rispondete.

Saluti a tutti

11 Risposte

  • Re: Socket tra applicazioni

    Che tipo di dati trasferisci? Probabilmente devi riconoscere il tipo di dato inviato. La comunicazione vedi che si instaura ma non restituisce l'informazione inviata o resta perennemente aperto il socket?
  • Re: Socket tra applicazioni

    In effetti è proprio questo il punto ossia il formato di comunicazione.

    In particolare, considerando che il server è sviluppato in Java, io utilizzo le seguenti istruzioni per mettermi in ascolto e se arriva qualcosa lo leggo: (ho fatto il CAST delle info ricevute ma non arrivo a quella istruzione)

    Di seguito un pezzo del codice per la comunicazione (preso da un esempio su internet) e tra Server/Client Java/Java va bene. Ma tra Java/other no.
    
    	ServerSocket server = new ServerSocket(server_Port);
    	while(true) {
    		Socket socket = server.accept();	//istruzione eseguita (debug)
    		ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());	//qui si ferma in attesa
    		String inmessage = (String) ois.readObject();
    		if(inmessage.contains("START")) {				 
    		...... }
    		etc.
    		ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    		oos.writeObject(outmessage);
    		ois.close();
    		oos.close();
    		socket.close();
    		if(message.equalsIgnoreCase("exit")) break;
    	}
    	server.close();
    
    Se il client invia una nuova stringa, il Server va in errore dicendo che ha ricevuti troppi dati.
    Considerando che i Client devono inviare i dati e ricevere anche delle risposte, vorrei sapere le socket se utilizzano un tipo specifico in modo da mettere i client d'accordo.

    Chi mi può aiutare ?

    Saluti
    cnesan
  • Re: Socket tra applicazioni

    Riporta l'output dell'errore
  • Re: Socket tra applicazioni

    Ok, ho modificato il sorgente che ho postato prima nel seguente modo ossia, dopo la connessione il server, quest'ultimo invia un messaggio al client: "ACCEPT MESSAGE".
    Il Client (VB6) riceve il messaggio "ACCEPT START" ma contiene una serie di caratteri in testa.
    Successivamente, invio dal client un messaggio "START" verso il server (Java), il server genera la seguente eccezione:
    Exception in Thread "main" java.io.StreamCorruptedException: invalid stream header: 4E4D4D54
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808)
    at java.io.ObjectInputstream.<init>(ObjectInputStream.java:301)
    at application-ServerReader.main(ServerReader.java:84

    Riporto il codice modificato con l'inserimento di due righe:
    
            while(true){
                System.out.println("Waiting for client request");
                //creating socket and waiting for client connection
                Socket socket = server.accept();
                System.out.println("Arrivato messaggio");
                //read from socket to ObjectInputStream object
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());	//ADD
                oos.writeObject("ACCEPT MESSAGE");											//ADD
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());            
                System.out.println("messaggio passato all'ObjectInputStream");
                //convert ObjectInputStream object to String
                String message = (String) ois.readObject();
                System.out.println("messaggio passato al readObject");
    
    Dal lato client, viene ricevuta la seguente stringa: "ACED0005740014" tradotti in esadecimale e seguita da "ACCEPT MESSAGE" in chiaro.
    Mi sembra di capire che, in effetti, per una corretta comunicazione ci devono essere caratteri di inizializzazione e di conclusione del messaggio (possibile?) o meglio il client deve gestire delle intestazioni da attaccare al messaggio in testa ?
  • Re: Socket tra applicazioni

    Errata corrige:
    Prima: Dal lato client, viene ricevuta la seguente stringa: "ACED0005740014" tradotti in esadecimale e seguita da "ACCEPT MESSAGE" in chiaro.
    Dopo: Dal lato client, viene ricevuta la seguente stringa: "ACED000574000E" tradotti in esadecimale e seguita da "ACCEPT MESSAGE" in chiaro.

    14 = E (paddato con zero).
  • Re: Socket tra applicazioni

    cnesan ha scritto:


    Errata corrige:
    Prima: Dal lato client, viene ricevuta la seguente stringa: "ACED0005740014" tradotti in esadecimale e seguita da "ACCEPT MESSAGE" in chiaro.
    Dopo: Dal lato client, viene ricevuta la seguente stringa: "ACED000574000E" tradotti in esadecimale e seguita da "ACCEPT MESSAGE" in chiaro.

    14 = E (paddato con zero).
    Ho un po di esperienza con i socket, ma non capisco quali sono i vari problemi che ti affliggono, mi sembra che stia comunicando, probabilmente hanno una formtattazione di testo differente, prova a forzare il tipo di formato inviato da entrambe le parti.
    Tipo ricevi con
    InputStreamReader(socket.getInputStream(), "UTF-8")
    e invii di conseguenza.

    fammi sapere.
  • Re: Socket tra applicazioni

    Quel codice non potrà mai funzionare con applicazioni NON-Java.
    Stai utilizzando la SERIALIZZAZIONE Java per la comunicazione (cioè stai trasferendo Java Objects), ovvero una tecnica prettamente Java, che utilizza un protocollo di comunicazione proprietario del mondo Java (invio di un header contenente informazioni sulla classe da trasferire, poi il bytecode serializzato dell'oggetto).

    Se vuoi che due programmi differenti (scritti con linguaggi differenti) comunichino tra di loro, devi scendere di livello ed utilizzare il trasferimento di byte (o stringhe semplici) su un canale non serializzato.

    Quindi, niente ObjectInputStream / ObjectOutputStream, ma piuttosto InputStream e OutputStream (o, meglio, DataInputStream e DataOutputStream che ti aiutano a trasferire tipi di dati primitivi).


    Ciao.
  • Re: Socket tra applicazioni

    Scusa Lele, ma io usato DataxStream per trasferire oggetti serializzati interi tra node.js e Java... ho usato tranquillamente all'inizio gli inputstreamreader e output sia con php che con nodejs...
  • Re: Socket tra applicazioni

    Ho detto una fesseria, ho usato Object , come effettivamente suggerisce la parola.
    https://github.com/PandoraSystem/DomoPi-CoreServer/blob/master/Dom/src/com/marktech/domopi/controller/servertcp/ServerRequest.java
  • Re: Socket tra applicazioni

    Non conosco node.js, quindi non so cosa abbiano implementato al suo interno, ma ti garantisco che per poter colloquiare con un server che usa la Java Serialization è necessario che il client si conformi ad essa iniziando la comunicazione inviando l'header corretto, altrimenti lato server viene sollevata una StreamCorruptedException con messaggio Invalid stream header.
    Quindi, a meno di usare librerie apposite o farsi tutto a mano, da VB non ci parli con quel server. In fin dei conti quel che viene letto dalla readObject() è un oggetto di una classe Java che il sever deve conoscere (avere in class-path!) e che deve implementare java.io.Serializable.

    Ciao.
  • Re: Socket tra applicazioni

    Ok, faccio l'ultimo tentativo come ha suggerito "LeleFT".

    Io volevo evitare di riscrivere i SW Client (attualmente in VB5-6) che inviano al server alcuni valori da memorizzare. Infatti già devo mettere mano al SW (VB6) che fa da Server poiché usa "MS ACCESS 97" non più utilizzabile per motivi aziendali.

    Il server in VB6 utilizzava un DB Access 97 per immagazzinare dati ed esportarli su richiesta autorizzata visuale.
    Il nuovo server in Java che sto sviluppando farà la stessa cosa del precedente ma utilizzerà HyperSQL.

    Sto leggendo il manuale HyperSQL e sono rimasto a bocca aperta. Sicuro che OpenSource ? E' utilizzabile per attività aziendali o bisogna acquistare qualche licenza ?

    Grazie a tutti per aver risposto.
Devi accedere o registrarti per scrivere nel forum
11 risposte