PDA

View Full Version : java&socket



Luceen
26th March 2007, 21:30
qualcuno mi sa dire cosa c'è che non và in questo codice?

import java.net.*;
import java.util.logging.*;
import java.lang.*;
public class ServerSomma {
public static void main(String[] args) throws Exception{
Logger logger = Logger.getLogger("global");
//logger.setLevel(Level.OFF);
if (args.length != 3)
System.out.println("Need 3 parameter!");
else{
int myPort=Integer.parseInt(args[2]);
int sum=0, num;
String message;
final int MAX_LEN = 10;
try {
InetAddress receiverHost =InetAddress.getByName(args[0]);
int receiverPort = Integer.parseInt(args[1]);
logger.info("Creo il socket");
DatagramSocket mySocket =new DatagramSocket(myPort);
logger.info("Creo il datagram packet");
byte[] buffer = new byte[MAX_LEN];
DatagramPacket datagram=new DatagramPacket(buffer, MAX_LEN, receiverHost, receiverPort);
for(int i=0;i<999;i++)
{
num=0;
buffer= new byte[MAX_LEN];
logger.info("in attesa di ricevere...");
mySocket.receive(datagram);
message=new String(buffer);
message=message.trim();
num=Integer.parseInt(message);
sum=sum+num;
logger.info(""+sum);
message=""+sum;
buffer= new byte[MAX_LEN];
buffer= message.getBytes();
logger.info("invio la somma parziale");
mySocket.send(datagram);
}
mySocket.close();
}
catch (Exception ex){
ex.printStackTrace();
}
}
}
}
dovrebbe ricevere un numero su una certa porta, poi restituire ad un ip : porta la somma parziale dei numeri ricevuti...
restituisce somme sballate..
qualcuno sa aiutarmi?

Tanek
26th March 2007, 21:41
Con /code salta l'indent?

Luceen
26th March 2007, 21:45
si

Axet
27th March 2007, 00:48
Per la tesina avevo fatto un programma tipo emule (server e N client) in VB.
La stragrande maggioranza delle volte capitavano degli errori perchè in pratica lo scambio di dati, regolato da un protocollo "home made", avveniva troppo velocemente.

Essenzialmente a volte arrivavano le intestazioni delle stringhe + le stringhe + parte della stringa precedente, il tutto quindi risultava sballato in fase di lettura da parte del secondo client.

All'epoca risolsi il problema inserendo un sistema simile allo stop & wait.. in pratica non trasmetti il pacchetto successivo finchè l'altro client non ti conferma di aver ricevuto quello appena inviato.
Dopo aver inserito questo accorgimento funzionava correttamente.

A me pare che il for spari fuori a rullo i pacchetti senza la minima temporizzazione, magari portebbe essere questo :)

San Vegeta
27th March 2007, 09:54
non c'ho tempo di guardarci ora, magari vedo dopo

Luceen
27th March 2007, 09:56
forse ho trovato il problema... probabilmente non mi ripulisce l'array di byte...

come faccio a ripulirlo?

NoeX
27th March 2007, 12:39
ripulire in che senso ? Distruggerlo ? Resettarlo tutto a 0 ?

Luceen
27th March 2007, 12:46
"inizializzarlo"

non so se array di byte inizializzato va tutto a 0...

Axet
27th March 2007, 13:29
Non credo che c'entri, il problema in quel caso ti si dovrebbe presentare solo sull'ultimo array che invii perchè magari non è pieno e i valori che lui non riempie rimangono settati a quelli del giro precedente.

Hai controllato se il problema può esser quel che ho detto all'inizio? :p

Luceen
27th March 2007, 19:27
il problema non è quello...
cmq ho notato che se il primo client invia 8... poi somma sempre 8 quindi al secondo client restituisce 16 poi 24 ecc...

quindi penso che il problema sia di array

San Vegeta
27th March 2007, 20:37
non ho una documentazione sottomano, cmq dovrebbe esserci un metodo clear(), reset() o qualcosa di simile... se non c'è ti fai una funzioncina del tipo


for(int i=0; i < ARRAY_LENGTH; i++) {
myByteArray[i] = 0;
}


sfrutta la documentazione ufficiale sul sito della sun, dice tutto quello che serve, inizializzazione, valori di default e metodi degli oggetti

per il resto avrei bisogno di debuggare il programma per dirti dov'è l'errore, così leggendo non lo noto

rosc
28th March 2007, 17:02
Ricordando esperienze antiche può essere che ti arrivino più pacchetti, cioè devi fare receive finchè la somma della lunghezza dei pacchetti è uguale alla lunghezza del messaggio.
vedi la documentazione del DatagramSocket.receive (http://java.sun.com/j2se/1.4.2/docs/api/).
Spero ti sia di aiuto.
Ciao