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 21-04-2006, 16:50   #1
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
[java o C# e .NET] Passare una stringa via internet

Ciao

Ho 2 programmini.

Questi fanno del lavoro, ma ad un certo punto occorre che uno dei 2 mandi una stringa all altro. Questo programma sa l' indirizzo di destinazione (http://xxxxxx.no-ip.org). Ma come faccio a mandare da internet la stringa?

Mi hanno detto i socket, o cose simili. Potete dirmi le righe di codice che mi servono a fare questa semplice cosa?
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 17:52   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
In Java puoi fare una cosa del genere (se hai il controllo sul ricevente):

Codice:
String testo = qualche testo;
//Codifica il testo in UTF-8
ByteBuffer textData = Charset.forName("utf-8").encode(testo);
//Codifica la lunghezza del testo in byte, formato UTF-8
ByteBuffer data = ByteBuffer.allocate(textData.capacity() + 4);
//Infila i dati in un buffer per la trasmissione
data.putInt(textData.capacity()).put(textData).flip();
//Crea un indirizzo http di connessione
URL address = new URL(indirizzo http ricevente);
//Ottiene la connessione
URLConnection conn = address.openConnection();
//attiva la scrittura di dati lungo la connessione
conn.setDoOutput(true);
//crea un canale per la trasmissione dei dati
WritableByteChannel out = Channels.newChannel(conn.getOutputStream());
//invia i dati lungo il canale
while(data.hasRemaning()) {
    out.write(data);
}
//chiude il canale
out.close();
Il ricevente legge il primo intero e determina quanto sia "grande" il messaggio ricevuto (supponiamo N byte). Poi legge N byte, li decodifica (Charset.forName("utf-8")).decode(byteBuffer)) e ottiene il testo. Ho omesso la gestione delle eccezioni per non complicare la lettura.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 09:13   #3
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
Quote:
Originariamente inviato da PGI-Bis
In Java puoi fare una cosa del genere (se hai il controllo sul ricevente):

Codice:
String testo = qualche testo;
//Codifica il testo in UTF-8
ByteBuffer textData = Charset.forName("utf-8").encode(testo);
//Codifica la lunghezza del testo in byte, formato UTF-8
ByteBuffer data = ByteBuffer.allocate(textData.capacity() + 4);
//Infila i dati in un buffer per la trasmissione
data.putInt(textData.capacity()).put(textData).flip();
//Crea un indirizzo http di connessione
URL address = new URL(indirizzo http ricevente);
//Ottiene la connessione
URLConnection conn = address.openConnection();
//attiva la scrittura di dati lungo la connessione
conn.setDoOutput(true);
//crea un canale per la trasmissione dei dati
WritableByteChannel out = Channels.newChannel(conn.getOutputStream());
//invia i dati lungo il canale
while(data.hasRemaning()) {
    out.write(data);
}
//chiude il canale
out.close();
Il ricevente legge il primo intero e determina quanto sia "grande" il messaggio ricevuto (supponiamo N byte). Poi legge N byte, li decodifica (Charset.forName("utf-8")).decode(byteBuffer)) e ottiene il testo. Ho omesso la gestione delle eccezioni per non complicare la lettura.

Ok grazie mille. Ho capito come inviare una stringa. AH sai mica come posso ricevere questa stringa?

In pratica il codice per il programma ricevente?

Ciao e
while (true) (grazie())

__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 14:52   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se non hai un server http attivo sulla porta a cui ti connetti ti conviene allora non usare l'URL. Il client diventa una cosa tipo:

Codice:
SocketChannel channel = 
    SocketChannel.open(new InetSocketAddress("xxxxx.no-ip.org", PORTA));
try {
	String text = "Hello World!";
	ByteBuffer textData = Charset.forName("utf-8").encode(text);
	ByteBuffer data = ByteBuffer.allocate(4 + textData.capacity());
	data.putInt(textData.capacity());
	data.put(textData);
	data.rewind();
	channel.write(data);
} finally {
	if(channel != null) try { channel.close(); } catch(Exception ex) {}
}
Che è la stessa cosa di prima solo che maneggi direttamente il socket (altrimenti devi realizzare un interprete per il protocollo http lato server).

Lato server la cosa è un po' più lunga ma non complicata. Quello che segue è un esempio di server con IO multiplo non bloccante:

Codice:
package it.tukano.commsample;

import java.net.*;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.util.*;
import java.nio.charset.*;

public class Server {
	public static void main(String...args) {
		new Server().start();
	}

	public void start() {
		Selector selector = null;
		ServerSocketChannel serv = null;
		try {
			serv = ServerSocketChannel.open();
			serv.socket().bind(new InetSocketAddress(
				InetAddress.getLocalHost().getHostAddress(),
				8080));
			serv.configureBlocking(false);
			selector = Selector.open();
			SelectionKey serverAccept = serv.register(selector,
				SelectionKey.OP_ACCEPT);
			long startupTime = System.currentTimeMillis();
			//Nessuna operazione entro 10 secondi? Spegni tutto (10000)
			while(selector.select(10000) != 0) {
				Iterator<SelectionKey> it = 
					selector.selectedKeys().iterator();
				while(it.hasNext()) {
					SelectionKey key = it.next();
					it.remove();
					handleKey(key);
				}
			}
		} catch(IOException ex) {
			ex.printStackTrace();
		} finally {
			close(selector);
			close(serv);
		}
	}
	
	/** Accetta un SocketChannel e lo registra in lettura */
	private void acceptClient(SelectionKey key) throws IOException {
		ServerSocketChannel serv = (ServerSocketChannel)key.channel();
		SocketChannel client = serv.accept();
		serv.register(key.selector(), SelectionKey.OP_ACCEPT);
		client.configureBlocking(false);
		client.register(key.selector(), SelectionKey.OP_READ);
	}
	
	/** Legge la lunghezza del messaggio (stima: non meno di 4 byte leggibili)*/
	private void readClientMessageLength(SelectionKey key) 
		throws IOException 
	{
		SocketChannel client = (SocketChannel)key.channel();
		ByteBuffer len = ByteBuffer.allocate(4);
		client.read(len);
		len.flip();
		client.register(key.selector(), SelectionKey.OP_READ, 
			ByteBuffer.allocate(len.asIntBuffer().get()));
	}
	
	/** Legge il corpo del messaggio */
	private void readClientMessage(SelectionKey key) 
		throws IOException 
	{
		ByteBuffer buffer = (ByteBuffer)key.attachment();
		SocketChannel client = (SocketChannel)key.channel();
		client.read(buffer);
		if(buffer.hasRemaining()) {
			client.register(key.selector(), SelectionKey.OP_READ, buffer);
		} else {
			client.close();
			buffer.rewind();
			printClientMessage(buffer);
		}
	}
	
	/** Stampa il messaggio ricevuto */
	private void printClientMessage(ByteBuffer buffer) {
		System.out.println("Server-riceve: " + 
			Charset.forName("UTF-8").decode(buffer));
	}
	
	private void handleKey(SelectionKey k) throws IOException {
		Selector sel = k.selector();
		SelectableChannel ch = k.channel();
		if(k.isConnectable()) {
			ch.register(sel, SelectionKey.OP_ACCEPT);
		} else if(k.isAcceptable()) {
			acceptClient(k);
		} else if(k.isReadable()) {
			Object att = k.attachment();
			if(att == null) {
				readClientMessageLength(k);
			} else if(att instanceof ByteBuffer) {
				readClientMessage(k);
			}
		}
	}
	
	private void close(ServerSocketChannel ch) {
		if(ch == null) return;
		try {
			ch.close();
		} catch(Exception ex) {}
	}
	
	private void close(Selector sel) {
		if(sel == null) return;
		try {
			sel.close();
		} catch(Exception ex) {}
	}
}
E' solo un'indicazione di massima. In concreto occorre un minimo di attenzione nel gestire i casi di premorte dei client.

Ultima modifica di PGI-Bis : 22-04-2006 alle 14:53. Motivo: errore nel codice
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2006, 10:49   #5
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
Quote:
Originariamente inviato da PGI-Bis
Se non hai un server http attivo sulla porta a cui ti connetti ti conviene allora non usare l'URL. Il client diventa una cosa tipo:

Codice:
SocketChannel channel = 
    SocketChannel.open(new InetSocketAddress("xxxxx.no-ip.org", PORTA));
try {
	String text = "Hello World!";
	ByteBuffer textData = Charset.forName("utf-8").encode(text);
	ByteBuffer data = ByteBuffer.allocate(4 + textData.capacity());
	data.putInt(textData.capacity());
	data.put(textData);
	data.rewind();
	channel.write(data);
} finally {
	if(channel != null) try { channel.close(); } catch(Exception ex) {}
}
Che è la stessa cosa di prima solo che maneggi direttamente il socket (altrimenti devi realizzare un interprete per il protocollo http lato server).

Lato server la cosa è un po' più lunga ma non complicata. Quello che segue è un esempio di server con IO multiplo non bloccante:

Codice:
package it.tukano.commsample;

import java.net.*;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.util.*;
import java.nio.charset.*;

public class Server {
	public static void main(String...args) {
		new Server().start();
	}

	public void start() {
		Selector selector = null;
		ServerSocketChannel serv = null;
		try {
			serv = ServerSocketChannel.open();
			serv.socket().bind(new InetSocketAddress(
				InetAddress.getLocalHost().getHostAddress(),
				8080));
			serv.configureBlocking(false);
			selector = Selector.open();
			SelectionKey serverAccept = serv.register(selector,
				SelectionKey.OP_ACCEPT);
			long startupTime = System.currentTimeMillis();
			//Nessuna operazione entro 10 secondi? Spegni tutto (10000)
			while(selector.select(10000) != 0) {
				Iterator<SelectionKey> it = 
					selector.selectedKeys().iterator();
				while(it.hasNext()) {
					SelectionKey key = it.next();
					it.remove();
					handleKey(key);
				}
			}
		} catch(IOException ex) {
			ex.printStackTrace();
		} finally {
			close(selector);
			close(serv);
		}
	}
	
	/** Accetta un SocketChannel e lo registra in lettura */
	private void acceptClient(SelectionKey key) throws IOException {
		ServerSocketChannel serv = (ServerSocketChannel)key.channel();
		SocketChannel client = serv.accept();
		serv.register(key.selector(), SelectionKey.OP_ACCEPT);
		client.configureBlocking(false);
		client.register(key.selector(), SelectionKey.OP_READ);
	}
	
	/** Legge la lunghezza del messaggio (stima: non meno di 4 byte leggibili)*/
	private void readClientMessageLength(SelectionKey key) 
		throws IOException 
	{
		SocketChannel client = (SocketChannel)key.channel();
		ByteBuffer len = ByteBuffer.allocate(4);
		client.read(len);
		len.flip();
		client.register(key.selector(), SelectionKey.OP_READ, 
			ByteBuffer.allocate(len.asIntBuffer().get()));
	}
	
	/** Legge il corpo del messaggio */
	private void readClientMessage(SelectionKey key) 
		throws IOException 
	{
		ByteBuffer buffer = (ByteBuffer)key.attachment();
		SocketChannel client = (SocketChannel)key.channel();
		client.read(buffer);
		if(buffer.hasRemaining()) {
			client.register(key.selector(), SelectionKey.OP_READ, buffer);
		} else {
			client.close();
			buffer.rewind();
			printClientMessage(buffer);
		}
	}
	
	/** Stampa il messaggio ricevuto */
	private void printClientMessage(ByteBuffer buffer) {
		System.out.println("Server-riceve: " + 
			Charset.forName("UTF-8").decode(buffer));
	}
	
	private void handleKey(SelectionKey k) throws IOException {
		Selector sel = k.selector();
		SelectableChannel ch = k.channel();
		if(k.isConnectable()) {
			ch.register(sel, SelectionKey.OP_ACCEPT);
		} else if(k.isAcceptable()) {
			acceptClient(k);
		} else if(k.isReadable()) {
			Object att = k.attachment();
			if(att == null) {
				readClientMessageLength(k);
			} else if(att instanceof ByteBuffer) {
				readClientMessage(k);
			}
		}
	}
	
	private void close(ServerSocketChannel ch) {
		if(ch == null) return;
		try {
			ch.close();
		} catch(Exception ex) {}
	}
	
	private void close(Selector sel) {
		if(sel == null) return;
		try {
			sel.close();
		} catch(Exception ex) {}
	}
}
E' solo un'indicazione di massima. In concreto occorre un minimo di attenzione nel gestire i casi di premorte dei client.

Grazie infinite. Mi metto subito al lavoro per implementarlo nel programma. Ciao e a presto
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 09:37   #6
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
Ciao

Sto implementando quel codice, ma ho trovato una difficoltà

ecco cosa in particolare

Quote:
SocketChannel channel =
SocketChannel.open(new InetSocketAddress("xxxxx.no-ip.org", PORTA));
try {
String text = "Hello World!";
ByteBuffer textData = Charset.forName("utf-8").encode(text);
ByteBuffer data = ByteBuffer.allocate(4 + textData.capacity());
data.putInt(textData.capacity());
data.put(textData);
data.rewind();
channel.write(data);
} finally {
if(channel != null) try { channel.close(); } catch(Exception ex) {}
}

Mi dice che in channel.write(data); Cannot find symbol. In effetti il channel non mi pare sia stato inizializzato da nessuna parte..
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 14:35   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ho controllato ed eseguito il codice prima di incollarlo. E' compatibile con la piattaforma Java 5.

La variabile channel è inizializzata al valore restituito da SocketChannel.open. L'operazione può non andare a buon fine ma è un fatto segnalato durante l'esecuzione.

Controlla che non ci sia qualche refuso nel codice che hai scritto. Un "cannot find symbol" può essere dovuto ad una svista di battitura.

Per sicurezza, incollo il codice completo della classe "Client" usata per il test:

Codice:
package it.tukano.commsample;

import java.net.*;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.util.*;
import java.nio.charset.*;

public class Client {

	public static void main(String...args) throws Throwable {
		SocketChannel channel = SocketChannel.open(new InetSocketAddress(args[0], 8080));
		try {
			String text = args[1];
			ByteBuffer textData = Charset.forName("utf-8").encode(text);
			ByteBuffer data = ByteBuffer.allocate(4 + textData.capacity());
			data.putInt(textData.capacity());
			data.put(textData);
			data.rewind();
			channel.write(data);
		} finally {
			if(channel != null) channel.close();
		}
	}
}
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2006, 11:46   #8
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
Ciao


Purtroppo ancora niente. Sempre los tesso errore. Ti posto lo screen che ne esce, così magari ci capisci qualcosa più di me.

Il jdk è l ultimo scaricato un paio di giorni fa per sicurezza, quindi il problema non è quello.



__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2006, 13:28   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Le variabili locali sono "locali" al blocco immediatamente contenente la loro dichiarazione, a partire dalla linea in cui compare la loro dichiarazione: fuori da quel blocco il loro nome significa "fuffa".

Un blocco in Java inizia dove si apre una parentesi graffa { e finisce alla corrispondente parentesi graffa di chiusura.

Codice:
try {//QUI SI APRE UN BLOCCO
    //QUI "channel" non esiste
    SocketChannel channel = ...
    //QUI il nome "channel" è la variabile qui sopra
}/*CHIUSURA DEL BLOCCO*/ catch(IOException ex) {//ALTRO BLOCCO
    //QUI il nome "channel" non esiste
    ex.printStackTrace();
} /* ALTRO BLOCCO CHIUSO */
//Qui il nome "channel" non esiste
Affinchè un nome significhi qualcosa in due blocchi diversi, occorre che il blocco immediatamente contenente la dichiarazione del nome contenga i due "sotto-blocchi". Nel tuo caso, il blocco immediatamente contenente potrebbe essere il corpo del metodo BottoneConnettiEccetera (attualmente il nome "channel" è contenuto nel corpo del metodo in questione ma il corpo non è immediatamente contenente: il blocco che segue il try "media" il contenimento del nome channel).
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2006, 17:29   #10
giova22
Senior Member
 
L'Avatar di giova22
 
Iscritto dal: Jun 2003
Città: Ferrara
Messaggi: 5953
ah ok ora ho capito meglio.

Ti ringrazio ancora infinitamente per l aiuto che mi hai dato. Spero a breve di finire il programma, e ovviamente rilascerò anche i sorgenti così che tutti possano vederli. Ciao e ri-grazie ancora.
__________________
Ho fatto affati con.... troppi Usate la ricerca sul forum... Penso un centinaio almeno
giova22 è 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 ...
La capsula SpaceX Dragon CRS-33 ha acces...
La NASA è sempre più vicin...
Crisi delle memorie: ASUS torna al passa...
Le console next-generation potrebbero es...
Gemini cresce ancora: la quota di mercat...
Samsung sfida TSMC: la capacità produtti...
Iliad alza il prezzo della fibra ottica ...
Il prossimo low cost di POCO sarà il più...
The Elder Scrolls VI: ecco le ultime sul...
Ecco i saldi di fine anno Amazon, 34 off...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
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: 22:44.


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