Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Socket UDP strano errore!

    Salve a tutti, ho scritto una piccola applicazione in java per il gioco del tris ( tutto testuale ), in cui faccio ciclare una volta un invio di dati tramite socket UDP e la volta successiva una ricezione di dati tramite una pocket UDP, in modo che due host possano comunicare fra loro.
    Il problema è che l'indirizzo ip e la porta a cui inviare i dati dopo il secondo ciclo diventano null....

    Ecco il codice sorgente:
    codice:
    private static void startGame( boolean myTurn ) throws NumberFormatException, IOException{
    	boolean isMyTurn = myTurn;
    	int cel = -1;
    	String comando = "";
    		
    //      playerIp è una variabile statica della classe
    //      userPort è una variabile statica della classe
    
    	while( gameIs ){
    		if( isMyTurn ){
    			System.out.println("Tuo turno");
    			BufferedReader dallaTastiera = new BufferedReader( new InputStreamReader( System.in ) );
    			comando = dallaTastiera.readLine();
    						
    			System.out.println("test dati: invio a " + playerIp + " : " + playerPort);
    			cel = Integer.parseInt( comando );
    			// connessione con host remoto tramite protocollo UDP
    			DatagramSocket conSocket = new DatagramSocket();
    			byte[] datiInvio = new byte[16];
    			byte[] datiRicevuti = new byte[16];
    			String testo = "cel=" + cel;
    			datiInvio = testo.getBytes();
    			DatagramPacket pacchettoInvio = new DatagramPacket( datiInvio, datiInvio.length, playerIp, playerPort );
    			conSocket.send(pacchettoInvio);
    			System.out.println("pacchetto inviato a " + playerIp + ":" + playerPort);
    						
    			DatagramPacket pacchettoRitorno = new DatagramPacket( datiRicevuti, datiRicevuti.length );
    			conSocket.receive(pacchettoRitorno);
    			String testoArrivato = new String( pacchettoRitorno.getData() );
    			System.out.println("pacchetto ricevuto: " + testoArrivato);
    			conSocket.close();
    	}
    	else{
    		System.out.println("In ascolto sulla porta " + userPort);
    		DatagramSocket serverSocket = new DatagramSocket( userPort );
    		byte[] datiRicevuti = new byte[16];
    		byte[] datiInvio = new byte[16];
    					
    		DatagramPacket pacchettoRicevuto = new DatagramPacket( datiRicevuti, datiRicevuti.length );
    		serverSocket.receive(pacchettoRicevuto);
    		String notifica = new String( pacchettoRicevuto.getData() );
    		InetAddress IP = pacchettoRicevuto.getAddress();
    		int prPorta = pacchettoRicevuto.getPort();
    					
    		System.out.println("Pacchetto ricevuto: " + notifica + " da " + IP + ", " + prPorta);
    					
    		datiInvio = msg.getBytes();
    		DatagramPacket pacchettoRisposta = new DatagramPacket( datiInvio, datiInvio.length, IP, prPorta );
    		serverSocket.send(pacchettoRisposta);
    		System.out.println("pacchetto inviato");
    		serverSocket.close();
    	}
    	isMyTurn = !isMyTurn;
        }// while
    }//	startGame
    Ed ecco l'errore:
    codice:
    In ascolto sulla porta 9191
    Pacchetto ricevuto: cel=2 da /127.0.0.1, 49410
    pacchetto inviato
    Tuo turno
    4
    test dati: invio a null : 0
    creazione pacchetto invio [5] a null : 0
    Exception in thread "main" java.lang.NullPointerException: null buffer || null address
    	at java.net.PlainDatagramSocketImpl.send(Native Method)
    	at java.net.DatagramSocket.send(DatagramSocket.java:625)
    	...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Socket UDP strano errore!

    Originariamente inviato da iJim
    Il problema è che l'indirizzo ip e la porta a cui inviare i dati dopo il secondo ciclo diventano null....
    playerIp/playerPort non si vede, dal solo codice postato, dove sono effettivamente tenute, chi e quando le inizializza, ecc.. Quindi con queste poche informazioni ci vorrebbe la sfera di cristallo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Spero che postando il codice completo la situazione sia più chiara!
    Non capisco come mai le due variabili diventano null !
    codice:
    public class TrisOnliApp{
    
      private static int playerPort;
      private static InetAddress playerIp;
    
      public static void main(String[] args){
        setPlayer( "192.168.1.171", "9091", "NomeAvversario" );
        startGame( true );
      }
    
    
      public static void setPlayer( String host, int port, String name ) throws UnknownHostException{
    	_setPlayer = true;
    	playerIp = InetAddress.getByName( host.substring(1) );
    	player = name;
    	playerPort = port;
      }
    
      private static void startGame( boolean myTurn ) throws NumberFormatException, IOException{
        // guarda nel post precedente
      }//	startGame
    
    }

  4. #4
    Domanda stupida forse, ma come lanci i due giocatori ?

  5. #5
    Dal terminale, lancio l'applicazione tramite il comando java my<package>.TrisOnlineApp 192.168.1.171

    Provo il gioco con due finestre del terminale e la partita per due cicli funziona, poi le variabili stranamente si settano a null.

    Ho fatto le prove con due pc, ma accade la stessa cosa

  6. #6
    volevo dati una mano facendo un debug, ma è tutto sballato..ci sono varibili neanche menzionate nella prima parte...msg, userport, _setPlayer e gameIs non si sa cosa sia...come fa a funzionarti?
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

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.