Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-06-2010, 15:52   #1
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
[JAVA] Passaggio oggetti tramite DatagramPacket

come ricostruisco l'oggetto che ho passato tramite una datagrampacket al server?

mi spiego.

sul server creo il mio labirinto 3d, che dfevo inviare a tutti i client in modo che loro possano "giocarlo".

facendo una comunicazione a più cliente e il più veloce possibile, sto usando datagrampacket.

ora, quando ricevo il datagrampacket faccio così:
Codice:
byte[] buf = new byte[1024];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
ora...come ricostruisco l'oggetto originale dal packet???
inoltre, come faccio a sapere la dimensione del buffer per evitare troppi "sopacchettamenti"?
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2010, 09:51   #2
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
uppetino?
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2010, 11:35   #3
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Penso che tu abbia implementato degli I/O stream in grado di interfacciarsi sulla rete attraverso UDP. Prova a postarne il codice, cosi vediamo.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2010, 12:41   #4
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
classe client
Codice:
package online;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

import labirinti.Labirinto;

public class Client {

	public static void main(String[] args) throws IOException {

		MulticastSocket socket = new MulticastSocket(4446);
		InetAddress address = InetAddress.getByName("224.0.0.1");
		socket.joinGroup(address);

		DatagramPacket packet;

		byte[] buf = new byte[1024];
		packet = new DatagramPacket(buf, buf.length);
		socket.receive(packet);
		buf=packet.getData();
		

		boolean flag = true;
		while (flag) {

			String received = new String(packet.getData(), 0, packet
					.getLength());
			System.out.println("Quote of the Moment: " + received);
		}

		socket.leaveGroup(address);
		socket.close();
	}

}
classe quoteserverthread
Codice:
package online;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;




public class QuoteServerThread extends Thread {

    protected DatagramSocket socket = null;
    protected BufferedReader in = null;
    protected boolean altroTesto = true;

    public QuoteServerThread() throws IOException {
	this("QuoteServerThread");
    }

    public QuoteServerThread(String name) throws IOException {
        super(name);
        socket = new DatagramSocket(4444);

        try {
            in = new BufferedReader(new FileReader("one-liners.txt"));
        } catch (FileNotFoundException e) {
            System.err.println("Could not open quote file. Serving time instead.");
        }
    }

    public void run() {

        while (altroTesto) {
            try {
                byte[] buf = new byte[1024];

                    // receive request
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);

                    // figure out response
                String dString = null;
                if (in == null)
                    dString = new Date().toString();
                else
                    dString = getNextQuote();
                buf = dString.getBytes();

		    // send the response to the client at "address" and "port"
                InetAddress address = packet.getAddress();
                int port = packet.getPort();
                packet = new DatagramPacket(buf, buf.length, address, port);
                socket.send(packet);
            } catch (IOException e) {
                e.printStackTrace();
		altroTesto = false;
            }
        }
        socket.close();
    }

    protected String getNextQuote() {
        String returnValue = null;
        try {
            if ((returnValue = in.readLine()) == null) {
                in.close();
		altroTesto = false;
                returnValue = "No more quotes. Goodbye.";
            }
        } catch (IOException e) {
            returnValue = "IOException occurred in server.";
        }
        return returnValue;
    }
}
classe server
Codice:
package online;

public class Server {
	public static void main(String[] args) throws java.io.IOException {
		new ServerThread(new ServerMakerLabirinto()).start();
	}
}

classe servermakerlabirinto
Codice:
package online;

import labirinti.Labirinto;
import labirinti.LabirintoSemplice;

public class ServerMakerLabirinto {

	private Labirinto labirinto;

	public ServerMakerLabirinto(){
		this.labirinto=new LabirintoSemplice();

	}
}
classe server thread
Codice:
package online;
import java.io.*;
import java.net.*;
import java.util.*;


public class ServerThread extends QuoteServerThread  {
	private long tempo = 5000;
	private ServerMakerLabirinto serverMakerLabirinto;

	public ServerThread(ServerMakerLabirinto serverMakerLabirinto) throws IOException {
		super("ServerThread");
		this.serverMakerLabirinto=serverMakerLabirinto;
	}

	public void run() {
		while (altroTesto) {
			try {
				byte[] buf = new byte[256];

				// construct quote
				String dString = null;
				if (in == null)
					dString = new Date().toString();
				else
					dString = getNextQuote();
				buf = dString.getBytes();

				// send it
				InetAddress group = InetAddress.getByName("224.0.0.1");
				DatagramPacket packet = new DatagramPacket(buf, buf.length,
						group, 4446);
				socket.send(packet);

				// sleep for a while
				try {
					sleep((long) (Math.random() * tempo));
				} catch (InterruptedException e) {
				}
			} catch (IOException e) {
				e.printStackTrace();
				altroTesto = false;
			}
		}
		socket.close();
	}

}
il funzionamento è "semplice":

il servermaker costruisce il labirinto e lo passa al server.

quando al server arrivano le richieste di 32 player (è un 1v1 il gioco) manda ad entrambi lo stesso labirinto, alchè i client costruiscono il proprio mondo 3d e mandano info continuamente al server che aggiorna il labirinto con le posizioni dei due pg e le rimanda ad entrambi.

credo che la strutura sia corretta, ma non sò come ricostruire il labirinto una volta arrivati sui client
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 10:37   #5
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
up???

stavo pensando, mi dovrei creare un costruttore di labirinto che ricevi un []byte, ma come "cacchio" faccio?

se pensate ad una soluzione diversa sparatemela pls, non ho molto tempo.
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 11:26   #6
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Costruisciti un tuo Input/Output stream, che recupera i byte da UDP, e lo agganci ad un Object stream.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 11:30   #7
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
Quote:
Originariamente inviato da nuovoUtente86 Guarda i messaggi
Costruisciti un tuo Input/Output stream, che recupera i byte da UDP, e lo agganci ad un Object stream.
e come?

mai fatto sinceramente
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 11:52   #8
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Estendendo le classi astratte InputStream e OutputStream. Considera anche, di aggiungere al tuo protocollo su UDP qualche controllo supplementare, in modo da forzare la ri-spedizione di qualche segmento perso.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 12:22   #9
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
Quote:
Originariamente inviato da nuovoUtente86 Guarda i messaggi
Estendendo le classi astratte InputStream e OutputStream. Considera anche, di aggiungere al tuo protocollo su UDP qualche controllo supplementare, in modo da forzare la ri-spedizione di qualche segmento perso.
ho trovato un "gioco" simile al mio, solo che usa rmi.


reputi sia più semplice?
o meglio fe come suggerisci tu?
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 15:35   #10
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Dipende molto da come intendi strutturare l' applicazione. Con RMI utilizzi gli oggetti remoti come se fossero in locale, quindi ti viene celata tutta la logica di rete che ci sta dietro. Nell' altro caso devi gestire da te il recupero degli oggetti e anche l' aventuale sincronizzazioni tra i "dati" prodotti localmente dai client e il server. Ovviamente cambia anche la distribuzione dei carichi di lavoro.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 16:15   #11
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
Quote:
Originariamente inviato da nuovoUtente86 Guarda i messaggi
Dipende molto da come intendi strutturare l' applicazione. Con RMI utilizzi gli oggetti remoti come se fossero in locale, quindi ti viene celata tutta la logica di rete che ci sta dietro. Nell' altro caso devi gestire da te il recupero degli oggetti e anche l' aventuale sincronizzazioni tra i "dati" prodotti localmente dai client e il server. Ovviamente cambia anche la distribuzione dei carichi di lavoro.
l'applicazione è già strutturata.

il gioco è nato come "in solo".

ora lo sto estendendo in ulty, 1v1, chi trova l'uscita prima vince.

praticamente il server crea il labirinto e lo comunica ai player, che creano il mondo 3d e lo navigano, comunicando al server la loro posizione continuamente, quindi inviano solo posizione(e non tutto come avevo pensato io prima), ma all'inizio ricevono tutto il labirinto.
il server quando riceve i dati li ricomunica a tutti.

cosa mi consigli di usare?

rmi forse è eccessivo in questa ottiva, vero?


e se usassi OBJECTOUTPUTSTREAM???

ho trovato un pdf che ne parla, me lo sto studiando.
__________________
My gaming placement

Ultima modifica di franksisca : 10-06-2010 alle 16:23.
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 16:26   #12
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Un' architettura ibrida? Nel senso che il gioco lo gestisci (una volta acquisito su ogni client il necessario) in locale su ogni client, come è giusto che sia, mentre la sincronizzazione tra i vari partecipanti, la fai in RMI in modo da gestirla, abbastanza agevolmente, come un' applicazione multi-thread sul server.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 16:27   #13
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
e se usassi OBJECTOUTPUTSTREAM???
ne avevo parlato all' inizio: lo utilizzi per recuperare gli oggetti che ti servono su ogni client.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 16:35   #14
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
Quote:
Originariamente inviato da nuovoUtente86 Guarda i messaggi
Un' architettura ibrida? Nel senso che il gioco lo gestisci (una volta acquisito su ogni client il necessario) in locale su ogni client, come è giusto che sia, mentre la sincronizzazione tra i vari partecipanti, la fai in RMI in modo da gestirla, abbastanza agevolmente, come un' applicazione multi-thread sul server.
si, ma credo che farlo con rmi sia troppo dispendioso (almeno questo mi passa per la testa ora)...ovvero, rmi lo vedo bello potente e questa cosa non mi sembra richieda tutta questa potenza...
Quote:
Originariamente inviato da nuovoUtente86 Guarda i messaggi
ne avevo parlato all' inizio: lo utilizzi per recuperare gli oggetti che ti servono su ogni client.
si, ma io non avevo capito

per info metto qui la dispensa, magari serve ad altri:
http://issuu.com/franksisca/docs/invio_oggetti_udp_java
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 18:31   #15
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
RMI è abbastanza potente, ma nel complesso non è affatto difficile implementare una buona struttura, anche perchè come ti dicevo ti concentreresti più sulla logica che sui dettagli del protocollo.
In alternativa, pur non conoscendo la mole di dati che transiterebbe sulla rete, mi viene in mente un sistema basato su UDP con Nack temporizzati(e magari gestione della mancanza temporanea di dati). In questo modo sarebbe il server a richiedere i dati in caso di mancata consegna. In tal modo aumenta la complessità e il carico computazionale del server, ma produci meno overhead di rete.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 16-06-2010, 11:24   #16
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
alora, ho fatto così:

client
Codice:
package online;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import labirinti.LabirintoSemplice;

public class Client {
	private InetAddress indirizzoIP;
	private MulticastSocket datagramSocket;
	private DatagramPacket datagramPacket;
	private ByteArrayInputStream byteData;
	private ByteArrayOutputStream byteOutput;

	private ObjectInputStream objectInput;
	private ObjectOutputStream objectOutput;

	public void start() {
		try {
			int port = 1300;
			// invio informazione al server della connessione avvenuta
			byte buffer[] = new byte[256];
			this.indirizzoIP = InetAddress.getByName("LocalHost");
			this.datagramSocket = new MulticastSocket(port);
			this.datagramSocket.joinGroup(this.indirizzoIP);
			this.byteOutput = new ByteArrayOutputStream();
			this.datagramPacket = new DatagramPacket(buffer, buffer.length,
					this.indirizzoIP, port);
			this.objectOutput = new ObjectOutputStream(this.byteOutput);
			this.objectOutput.writeObject("sono connesso");
			// ricevo dal server il labirinto in cui muovermi
			this.datagramPacket = new DatagramPacket(buffer, buffer.length);
			this.datagramSocket.receive(this.datagramPacket);
			this.byteData = new ByteArrayInputStream(this.datagramPacket
					.getData());
			this.objectInput = new ObjectInputStream(this.byteData);
			LabirintoSemplice labirinto = (LabirintoSemplice) this.objectInput
					.readObject();// ricevo il labirinto e costruisco l'ambiente
			// grafico
			AmbienteOnlineClient ambienteClient = new AmbienteOnlineClient(
					labirinto);
			while (true) {// fino a quando qualcuno non vince

			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
server:
Codice:
package online;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ServerThread extends QuoteServerThread {
	private ServerMakerLabirinto serverMakerLabirinto;
	private MulticastSocket multicastSocket;
	private ByteArrayOutputStream byteOutput;
	private DatagramPacket pacchetto;
	private ByteArrayInputStream byteData;
	private ObjectOutputStream objectOutput;
	private ObjectInputStream objectInput;
	private InetAddress indirizzoIP;

	public ServerThread(ServerMakerLabirinto serverMakerLabirinto)
			throws IOException {
		super("ServerThread");
		this.serverMakerLabirinto = serverMakerLabirinto;
	}

	public void run() {
		try {
			this.indirizzoIP = InetAddress.getByName("LocalHost");
			int port = 1300;
			this.multicastSocket = new MulticastSocket();

			byte[] data = new byte[1024];
			int cnt = 0;
			while (cnt < 2) {// aspetto i 2 client connessi
				this.pacchetto = new DatagramPacket(data, data.length);
				this.multicastSocket.receive(this.pacchetto);
				this.byteData = new ByteArrayInputStream(this.pacchetto
						.getData());
				this.objectInput = new ObjectInputStream(this.byteData);
				this.objectInput.readObject();
				cnt++;
			}
			// i 2 client sono connessi, quindi invio ad entrambi il labiritno
			// costruito senza mostri
			this.byteOutput = new ByteArrayOutputStream();
			this.pacchetto = new DatagramPacket(data, data.length,
					this.indirizzoIP, port);
			this.objectOutput = new ObjectOutputStream(this.byteOutput);
			this.objectOutput.writeObject(this.serverMakerLabirinto
					.getLabirinto()); // invio il labirinto ai client
			this.objectOutput.flush();
			data = this.byteOutput.toByteArray();
			this.pacchetto.setData(data);
			this.pacchetto.setLength(data.length);
			this.multicastSocket.send(this.pacchetto);
			this.byteOutput.reset();
			while (true) {// ricevo i labirinti dai client e li reinvio

			}
		} catch (Exception e) {
		}
	}
}

credete che sia valida come soluzione?
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Roscosmos ha posticipato (ancora) il lan...
Isar Aerospace si prepara al secondo lan...
Tory Bruno è entrato in Blue Orig...
Fujifilm lancia la cartuccia per archivi...
Dreame H15 Mix: la soluzione 7-in-1 per ...
AirPods Pro 3 in forte sconto su Amazon:...
36 offerte Amazon, molte appena partite:...
2 caricatori multipli eccezionali: da 28...
OLED e 360 Hz a un prezzo senza preceden...
Roborock Q10 S5+ a un prezzo molto conve...
Upgrade PC a prezzo ridotto: le migliori...
Sono i 6 smartphone migliori su Amazon: ...
Google Pixel 9a a 361€, mai così ...
Super sconti sugli spazzolini Oral-B, an...
Aspira a 6000Pa, lava bene, costa 139€: ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v