Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    28

    Problema ricezione client protocollo tcp

    Ciao a tutti, ho provato a realizzare un client ed un server con protocollo tcp: il client invia un intero al server che somma uno al numero ricevuto e lo rispedisce al server ma il programma non funziona, nel senso che il server non riceve nulla. Il problema riguarda l'ultimo metodo readLine del client...come posso risolverlo? Ho inserito anche metodi flush(), ma non ho risolto nulla...

    Ecco il client:
    codice:
    import java.io.*;
    import java.net.*;
    
    class Client{
    	
    	public static void main(String argv[]) throws Exception {
    		
    		
    		String num;
    		String  somma;
    		
    		Socket clientSocket = new Socket("localhost", 6789);
    		
    		DataOutputStream outToServer= new DataOutputStream(clientSocket.getOutputStream());
    		
    		
    		BufferedReader inFromUser=new BufferedReader(new InputStreamReader(System.in));
    		
    		
    		BufferedReader inFromServer=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    
    		System.out.println("Inserire un intero: ");
    	
    		num=inFromUser.readLine();
    					
    		outToServer.writeBytes(num);
    		outToServer.flush();
    		
    
                   //qui c'è qualcosa che non va
    	
    		somma=inFromServer.readLine();
    		
    		System.out.println(somma);
    		
    		clientSocket.close();
    		}
    													
    	}
    Ecco il server:

    codice:
    
    import java.io.*;
    import java.net.*;
    
    class Server{
    	
    	public static void main(String argv[]) throws Exception {
    		
    		String num;
    		String somma;
    		
    		ServerSocket welcomeSocket = new ServerSocket(6789);
    		
    			while(true) {
    				
    					Socket connectionSocket = welcomeSocket.accept();
    					
    					System.out.println("server connesso");
    					
    					
    					BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
    					
     DataInputStream(connectionSocket.getInputStream());
    					
    					DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
    					
    					num=inFromClient.readLine();
    					
    					System.out.println("Il numero ricevuto dal client è : "+ num);
    					
    					//calcolo somma +1
    					 int sommaint=Integer.parseInt(num)+1;
    
    					 somma =Integer.toString(sommaint);
    			
    					System.out.println("La somma incrementata di uno è: "+ somma);
    					
    					outToClient.writeBytes(somma);
    					outToClient.flush();
    					
    					connectionSocket.close();  
    					
    						}
    					}
    				}

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Nella parte server tu usi la readLine(). Questo metodo ritorna tutto il testo che è presente nell'InputStream fino al raggiungimento del carattere di newLine.

    Ma tu nel client non stai inviando il carattere di newLine. La classe BufferedReader, infatti, filtra il contenuto dell'InputStream e ritorna la riga senza il carattere di newLine.

    Soluzione, da applicare nel client:

    codice:
    outToServer.writeBytes(num + System.getProperty("line.separator"));
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    28
    Grazie mille! Ora funziona

    E' l'unica soluzione per risolvere il problema? Cosa potrei usare al posto di readLine()?


    Poichè in questo caso si trattava di inviare e ricevere interi, mi era stato suggerito di usare oggetti DataOutputStream e DataInputStream per l'input da tastiera e da client/server con il metodo readInt() ma provando credo che non vada bene visto che ottengo valori esadecimali, o sbaglio io qualcosa?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    DataInputStream e DataOutputStream vanno bene per le comunicazioni da client a server e viceversa... non vanno particolarmente bene per la lettura dell'input dell'utente, dove conviene sempre trattare tutto come String ed effettuare la validazione dell'input in separata sede.

    Dovremmo vedere il codice che avevi scritto per capire cosa non funzionava con la soluzione DataInput/OutputStream.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    28
    Ciao, questo è il codice con DataInputStream e DataOutputStream:

    Client

    codice:
    import java.io.*;
    import java.net.*;
    
    class Client{
    	
    	public static void main(String argv[]) throws Exception {
    		
    		int somma;
    		int num;
    		
    		Socket clientSocket = new Socket("localhost", 6789);
    		
    		//output al Server
    		DataOutputStream outToServer= new DataOutputStream(clientSocket.getOutputStream());
    		
    		//input da tastiera
    		DataInputStream dis =new DataInputStream(System.in);
    		
    		//input da server
    		DataInputStream dis2=new DataInputStream(clientSocket.getInputStream());
    
    		System.out.println("Inserire un intero: ");
    	
    		num=dis.readInt();
    		
    		System.out.println("Il numero inserito é  "+ num);
    		
    		outToServer.writeBytes(num + "\n");
    		outToServer.flush();
    	
    		somma=dis2.readInt();
    		
    		
    		System.out.println("La somma incrementata di uno è : "+somma);
    		
    		clientSocket.close();
    		}
    													
    	}

    Server


    codice:
    
    import java.io.*;
    import java.net.*;
    
    class Server{
    	
    	public static void main(String argv[]) throws Exception {
    		
    		int num;
    		int somma;
    		
    		ServerSocket welcomeSocket = new ServerSocket(6789);
    		
    			while(true) {
    				
    					Socket connectionSocket = welcomeSocket.accept();
    					
    					System.out.println("Server connesso...");
    					
    					//input dal Client
    					DataInputStream dis= new DataInputStream(connectionSocket.getInputStream());
    					
    					//output al Server
    					DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
    					
    					num=dis.readInt();
    		
    					System.out.println("Il numero ricevuto dal client è : "+ num);
    					
    					//calcolo somma +1
    					 somma= num+1;
    					
    					outToClient.writeInt(somma);
    					outToClient.flush();
    				
    					
    					connectionSocket.close();  
    					
    						}
    					}
    				}
    Questo è il risultato quando si inserisce da tastiera un intero ad es. 4:

    Dal Client
    codice:
    Inserire un intero: 
    4
    Il numero inserito é  873269773
    La somma incrementata di uno è : 943141683
    Dal Server
    codice:
    Server connesso...
    Il numero ricevuto dal client è : 943141682

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Ci sono due errori nel tuo codice.

    1) Non hai ascoltato il mio suggerimento di NON utilizzare un DataInputStream per la lettura da tastiera: DataInputStream non va bene per l'input da tastiera perchè tutto ciò che arriva da tastiera è in formato stringa... non puoi, quindi, leggere un intero da tastiera perchè un intero è un insieme di 4 byte strutturati. Quello che tu invii, invece, è una stringa contenente il carattere "4".

    2) Al server stai cercando di inviare un byte al posto di un intero ( writeByte() al posto di writeInt() ) a cui però aggiungi il carattere di newLine come se tu stessi inviando una stringa... e dall'altra parte il server cerca di leggere un intero (readInt() )... un minestrone da paura!

    Ecco una versione "riveduta e corretta" del tuo Client con l'uso dei DataInput/OutputStream (il server va bene così com'è). Il metodo aggiuntivo "parsaNumero" si può migliorare e l'intera gestione dell'input è migliorabile, ma questo è solo un esempio banale.

    codice:
    import java.io.*;
    import java.net.*;
    
    class Client{
    	
    	public static void main(String argv[]) throws Exception {
    		
    		int somma;
    		int num;
    		
    		Socket clientSocket = new Socket("localhost", 6789);
    		
    		//output al Server
    		DataOutputStream outToServer= new DataOutputStream(clientSocket.getOutputStream());
    		
    		//input da tastiera
    		BufferedReader dis =new BufferedReader( new InputStreamReader(System.in) );
    		
    		//input da server
    		DataInputStream dis2=new DataInputStream(clientSocket.getInputStream());
    
    		System.out.println("Inserire un intero: ");
    
    		String linea = dis.readLine();
    	
    		num = parsaNumero( linea );
    		
    		System.out.println("Il numero inserito é  "+ num);
    		
    		outToServer.writeInt(num);
    		outToServer.flush();
    	
    		somma=dis2.readInt();
    		
    		
    		System.out.println("La somma incrementata di uno è : "+somma);
    		
    		clientSocket.close();
    	}
    
    	private static int parsaNumero(String s) {
    		return Integer.parseInt( s );
    	}
    												
    }
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.