Visualizzazione dei risultati da 1 a 4 su 4

Discussione: problemi socket

  1. #1

    problemi socket

    Salve a tutti.. avrei un problema con la gestione di una socket.
    Ho un server che accetta delle connessioni sulla sua serversocket e poi a seconda del client connesso, lancia due diversi tipi di Thread, a seconda che il client sia semplice o CLientAmministratore.
    codice:
            Socket s = ss.accept();
    	System.out.println(" Ho eseguito la accept");
    	BufferedReader br =new BufferedReader(newInputStreamReader(s.getInputStream()));
    	String user = br.readLine();
    	if(user.equals("administrator")){
    			GestoreAdmin ga=new GestoreAdmin(s,list);
    			ga.start();
    	}else{
    			GestoreClient g = new GestoreClient(list,s,user);
    			g.start();
    	}
    ok... quindi come si vede, nel GestoreAdmin io passo anche il riferimento alla socket s.
    ora questo gestore riceve dei messaggi da un eventuale client amministratore al quale poi dovrà rispondere.
    La mia idea è quella che, dopo che il Server risponde al clientAmministratore, la connessione dovrebbe rimanere aperta per altri scambi di messaggi, ma questo non avviene.
    ecco la parte di codice incriminata:
    codice:
    try{
    	socketcopy=socket;
    	in=new BufferedReader(new InputStreamReader(socketcopy.getInputStream()));
    	String msg=null;
    	while((msg=in.readLine())!=null){
    	out=new PrintWriter(socketcopy.getOutputStream());
    	if(msg.equals("esegui")){
    	Iterator<Struttura> it = list.Iterator();
    	int i=1;
    	while(it.hasNext()){
    		Struttura temp=it.next();
    		out.println(temp.getUser());
    		out.flush();
    		i++;
    	}
    	out.close();  <----
    }catch bla bla
    ora il mio problema tecnico è questo:
    mantendo l'out.close(), chiudo il buffer di scrittura e di conseguenza la socket, questo è quello ke mi torna su consolle:
    codice:
    java.net.SocketException: socket closed
    	at java.net.SocketInputStream.socketRead0(Native Method)
    	at java.net.SocketInputStream.read(Unknown Source)
    	at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    	at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    	at sun.nio.cs.StreamDecoder.read(Unknown Source)
    	at java.io.InputStreamReader.read(Unknown Source)
    	at java.io.BufferedReader.fill(Unknown Source)
    	at java.io.BufferedReader.readLine(Unknown Source)
    	at java.io.BufferedReader.readLine(Unknown Source)
    	at server.GestoreAdmin.run(Server.java:91)
    se invece tolgo l'operazione out.close(), non so perchè ma il clientAmministratore rimane fermo sulla readLine(); come se il server senza quell'istruzione non svuotasse il buffer, o addirittura non finisse di inviare i messaggi..
    sto impazzendo
    qualcuno puo aiutarmi? grazie

  2. #2
    togli l'out.close() e cambia costruttore nel printwriter:

    codice:
    out=new PrintWriter(socketcopy.getOutputStream(), true);
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

  3. #3
    allora, forse credo che il problema non sia la socket ma più che altro qualche gestore delle swing. ti spiego: togliendo l'out.close(); il clientAmministratore, su consolle stampa, ma sulla finestra grafica non stampa niente e sembra rimanere nel ciclo:
    codice:
    while((name=in.readLine())!=null ){
    	i++;
    	System.out.println("name: "+name);
    	m.addElement(name+" "+i);
    }	
    System.out.println("sono uscito dal while");
    perchè l'ultima stampa non me la fa mai! puoi aiutarmi?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Credo sia il solito problema dovuto al fatto che tieni impegnato l'EDT (Event Dispatcher Thread): il server dovrebbe risiedere su un Thread separato, che non vada ad impegnare l'EDT. Tutte le operazioni di modifica dell'interfaccia grafica dovrebbero essere fatte nel contesto dell'EDT, ma solo quelle... non tutte le altre (come, ad esempio, l'attesa per l'arrivo di una nuova connessione al server, operazioni di I/O, ecc).

    Cerca su questo forum, se ne è parlato tanto.

    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.