Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327

    [JAVA] Leggere l'intero stream passatomi attraverso socket

    Salve,
    sto realizzando un applicazione client/server che comunica attraverso socket in TCP.

    Vi spiego nel dettaglio cosa deve fare l'app server.

    1. Resta in ascolto su una porta.
    2. Quando riceve una connessione in entrata da parte di un client, crea un Thread che poi conterrà il cuore vero e proprio della comunicazione del client.
    3. A questo punto il server, dopo aver inizializzato il thread, dovrebbe restare in attesa di ricevere qualcosa dal client.

    Per esigenze personali devo leggermi lo stream creandomi un oggetto BufferedInputStream

    esempio
    Buffin = BufferedInputStream(miosocket.getInputStream());

    e poi, attraverso un mio metodo, andare a leggere soltanto i byte che mi servono e dopo l'intero stream restante.
    Quindi per capirci, leggo i primi byte dello stream, se contengono quello che voglio vado a leggermi la parte restante.

    Adesso passiamo alle domande

    Per la lettura di un tot di byte non ci sono problemi ma se volessi andarmi a leggere la parte restante dello stream?? io non conosco la dimensione di byte dello stream, c'è un metodo java che mi permette di leggermelo direttamente??

    dopo aver letto tutto quanto ed eseguito l'elaborazione del codice, vorrei che il server si rimettesse in attesa...

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    scusa ma come imposti il server??
    Mi fai vedere il codice di creazione del server e come accetti le richieste del client? Perché io l'ho fatto una marea di volte, passo oggetti interi da un punto all'altro e non ho i problemi che hai tu

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    allora ecco dei pezzi del mio codice



    Allora questa è la parte che serve al Server per restare in ascolto di nuove comunicazioni e per creare nuovi thread quando un nuovo client di connette

    codice:
    public class InitServer {
    
    	private int m_iPortNumber;
    	private ServerSocket m_oListenSocket;
    	private Socket m_oWorkingSocket;
    	
    	public InitServer () {
    		
    		m_iPortNumber = 0;
    		m_oListenSocket = null;
    		
    	}
    
    	public void setListenPort(int port_number) {
    		
    		m_iPortNumber = port_number;
    		
    	}
    	
    	
    	/* Inizializza il Socket */
    	public boolean init() {
    		
    		if (m_oListenSocket != null) {
    			
    			System.out.println("init - Socket già inizializzato");
    			return true;
    			
    		}
    
    		try
    		{
    			m_oListenSocket = new ServerSocket(m_iPortNumber);
    		}
    		catch (Exception e)
    		{
    			System.out.println("init - fallita ServerSocket, port_number=[" + m_iPortNumber + "]: " + e.getMessage());
    			return false;
    		}
    
    		return true;
    		
    	}
    	
    	
    	/* Termina il Socket */
    	public int end() {
    		
    		if (m_oListenSocket != null) {
    			
    			try
    			{
    				m_oListenSocket.close();
    			}
    			catch (Exception e)
    			{
    				System.out.println("end - fallita close del socket: " + e.getMessage());
    			}
    			m_oListenSocket = null;
    		}
    
    		return 0;
    		
    	}
    	
    	/* Metto in ascolto il Socket */
    	public int getConnection(int iTimeout) {
    		
    		if (m_oListenSocket == null) {
    			
    			System.out.println("getConnection - Socket non inizializzato");
    			return 3;
    			
    		}
    		
    		System.out.println("getConnection - mi metto in ascolto sulla porta " + m_oListenSocket.getLocalPort());
    		
    		try
    		{
    			
    			m_oWorkingSocket = m_oListenSocket.accept();
    			//System.out.println(m_oWorkingSocket.getReceiveBufferSize());
    			//m_oWorkingSocket.setSoTimeout(iTimeout);
    			
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    			
    			System.out.println("getConnection - Connessione Fallita: " + e.getMessage());
    			//end();
    			return 2;
    		}
    		
    		System.out.println("getConnection - Richiesta accettata da " + m_oWorkingSocket.getInetAddress().getHostAddress() + " sulla porta " + m_oWorkingSocket.getLocalPort());
    		return 1;
    		
    	}
    	
    
    	public Socket getSocket() {
    		
    		return m_oWorkingSocket;
    		
    	}
    	
    	
    	
    	public void startWorkServer() {
    		
    		int iTimeout = 5000;
    		m_iPortNumber = 60000;
    		
    		Thread oThread;
    
    		if (init()) {
    
    			do{
    					
    				int ConnSocket = getConnection(iTimeout);
    				
    				if (ConnSocket == 1){
    
    					// Istanzio la classe che gestisce la comunicazione con il server, gli passo la socket appena avviata e avvio tutto quanto all'interno di una Thread
    					ThreadServer serverT = new ThreadServer();
    					serverT.setWorkingSocket(getSocket());
    					oThread = new Thread(serverT);
    					oThread.start();
    				
    				}else if (ConnSocket == 3){
    
    					init();
    
    				}
    				
    			} while (true);
    
    		}
    		
    	}
    
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		InitServer oTCPServer;
    		oTCPServer = new InitServer ();
    		
    		oTCPServer.startWorkServer();
    		
    	}
    
    }

    Questa classe del server invece gestisce la comunicazione con un client dopo la creazione del thread

    codice:
    public class ThreadServer implements Runnable{
    
    	protected Socket m_oWorkingSocket;
    	private BufferedReader in;
    	private BufferedWriter out;
    	private BufferedInputStream BuffIn;
    	private BufferedOutputStream BuffOut;
    	private String valueSTR = "";
    	
    	
    	/* setta il socket in questo Thread */
    	public void setWorkingSocket(Socket oWS) {
    		
    		m_oWorkingSocket = oWS;
    		
    	}
    
    	
    	/* controlla l'inizializzazione del Socket */
    	public int checkSocket(){
    		
    		if (m_oWorkingSocket == null) {
    			
    			System.out.println("checkSocket - Socket non inizializzato");
    			return -1;
    			
    		}
    		return 1;
    		
    	}
    	
    	
    	/* Termina il socket corrente e chiude la comunicazione con il client */
    	public int end() {
    		
    		if (m_oWorkingSocket != null) {
    			
    			try {
    				
    				m_oWorkingSocket.close();
    				
    			} catch (IOException e) {
    				
    				System.out.println("end - fallita close:" + e.getMessage());
    				
    			}
    			
    			m_oWorkingSocket = null;
    			
    		}
    
    		return 0;
    		
    	}
    	
    	
    	/* Inizializza il buffer per la lettura e la scrittura */
    	public void BufferStream() {
    		
    		try {
    			
    			BuffIn = new BufferedInputStream(m_oWorkingSocket.getInputStream());
    			BuffOut = new BufferedOutputStream(m_oWorkingSocket.getOutputStream());
    			
    			/* comunico al client l'avvenuta connessione */
    			if (!writeBytes("SERVER OK".getBytes())){
    
    				System.out.println("BufferStream - Impossibile al momento instaurare una comunicazione Client/Server");
    				
    			}
    				
    		} catch (Exception e) {
    
    			System.out.println("BufferStream - Impossibile al momento instaurare una comunicazione Client/Server");
    		
    		}
    		
    	}
    
    	
    	/* Legge lo stream di byte che riceve sul socket */
    	public byte[] readBytes_2(int NumByte) {
    			
    		byte[] abHeaderBuff = new byte[NumByte];
    		
    		try {
    
    			BuffIn.read(abHeaderBuff);
    
    		} catch (IOException e) {
    
    		}
    		
    		return abHeaderBuff;
    		
    	}	
    	
    	/* Invia byte allo stream del socket */
    	public boolean writeBytes(byte[] abBuffToWrite) {
    		
    		boolean bResult;
    		
    		try {
    			
    			BuffOut.write(abBuffToWrite);
    			BuffOut.flush();
    			System.out.println("writeBytes - inviati " + abBuffToWrite.length + " byte del buffer");
    			bResult = true;
    			
    		} catch (IOException exc) {
    			
    			System.out.println("writeBytes - errore nell'invio del buffer");
    			bResult = false;
    			
    		}
    		
    		return bResult;
    		
    	}
    		
    	
    	/* Gestisce le richieste del client connesso  */
    	public int manageRequest() throws Exception {
    
    		String value = null;
    		int iResult = 0;
    		
    		
    		byte[] Buffer;
    		
    		System.out.println("In attesa di un comando...");
    
    		readBytes_2(10);
    		
    		//controllo se questi 10 byte contengono quello che voglio, se è si allora deve terminare di leggermi la parte restante dello stream stream
    		
    		return iResult;
    		
    	}
    	
    	
    	/* Metodo convenzionale/iniziale del Thread, avviato eseguendo thread.start(); */
    	public void run() {
    		
    		int iResult = 0;
    		
    		System.out.println("startWork: Sessione " + Thread.currentThread().getName() + " inizializzata per il seguente client " + m_oWorkingSocket.getInetAddress().getHostAddress());
    		
    		if (checkSocket() > 0){
    
    			/* Inizializzo il buffer per lo scambio di dati client/server */
    			BufferStream();
    			
    			do {
    				
    				try {
    					
    					iResult = manageRequest();
    					
    				} catch (Exception e) {
    	
    					//e.printStackTrace();
    					System.out.println("Errore nel gestire la richiesta");
    					iResult = -1;
    					
    				}
    				
    			} while (iResult == 0); //il ciclo termina quando iResult è diverso da 0
    		
    		}
    		
    		System.out.println("La connessione con il client " + m_oWorkingSocket.getInetAddress().getHostAddress() + " è stata terminata.");
    		end();
    		
    	}
    	
    }

    in particolare il BufferStream instanzia l'oggetto BufferedInputStream, manageRequest() è la classe che dovrebbe gestirsi l'elaborazione dei comandi che le vengono inviati nello stream.
    Dentro
    manageRequest()
    viene lancianto readBytes_2(10); che resta in attesa di comandi inviati dal client, quando il client invia qualcosa, vengono letti i primi 10 byte e se contengono quello che gli serve allora manageRequest() si va a leggere la parte restante dello stream


    grazie mille per l'aiuto che mi stai dando, son un po confuso su questo punto, scusa se in questi ultimi giorni sto tartassando il forum ma sto impazzendo

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    stai facendo un po' di confusione sull'uso del socket.
    In particolare il server è in perenne attesa di richieste, cosa che banalmente realizzi con una roba di questo tipo

    codice:
    ServerSocket serverSocket;
     private void initServer() {
            try {
                serverSocket = new ServerSocket(9000);
                while (true) {
                    Socket socket = serverSocket.accept();
                    Thread thread = new Thread(new ThreadServer(socket));
                    thread.start();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    
        }
    così resti in attesa di altre richieste. In particolare all'accettazione di una connessione,avvi il server e ritorni in attesa di un'altra connessione.

    In secondo luogo, riguardo al buffer, la comunicazione client/server in genere non ha quel grado di interattività che vuoi creare tu (almeno non direttamente).
    Devi sapere cosa mandi e quanti dati mandi, devi sapere che le read sono bloccanti, devi gestire il blocco.
    In rete trovi una marea di esempi su comunicazioni client/server, chiarisci bene le idee sui tuoi obiettivi

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    si so che le read sono bloccanti, ma non esiste un timeout per la read?? come faccio a gestirlo?? ho visto che c'è il setSoTimeOut del socket ma quello mi fa andare in eccezione la socket, non penso che sia corretto farlo con quello

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Guarda un po

    qui

    e qui

    in particolare nel secondo link come dici tu sollevi un'eccezione, ma devi pensare tu a catcharla e a chiudere il socket in maniera corretta

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    grazie mille per l'aiuto

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da hackerdm
    ho visto che c'è il setSoTimeOut del socket ma quello mi fa andare in eccezione la socket, non penso che sia corretto farlo con quello
    Solo una piccola puntualizzazione: eccezione non significa sempre e solo "problemi". Se è stato impostato un timeout sulla socket, sollevare una SocketTimeoutException significa solo far sapere al programma che la read() è stata interrotta perchè non ha ricevuto dati nel tempo prestabilito... nessuno ti vieta, dopo una SocketTimoutException, di rimetterti in attesa sulla stessa Socket che, come dice la documentazione, è ancora valida.

    If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid

    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

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.