Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Socket

  1. #1

    Socket

    Salve a tutti, ho un problema con i socket...
    Ho creato due classi (Server e Client) da utilizzare eventualmente in altri programmi.
    Con il server apparentemente non ho problemi e riesco a ricevere messaggi di prova che invio con telnet, il client invece mi genera diverse eccezioni, tra cui "java.net.SocketException: Broken pipe"

    Vi posto il codice del server:
    codice:
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server{
    	ServerSocket socket;
    	Socket connection = null;
    	DataOutputStream out;
    	DataInputStream in;
    	String message;
    	
    	Server(int port){
    		try {
    			socket = new ServerSocket(port);
    			System.err.println("In listening...");
    			connection = socket.accept();
    			System.err.println("Connessione avvenuta con " + connection.getInetAddress().getHostName());
    			in = new DataInputStream(connection.getInputStream());  
    		    out = new DataOutputStream(connection.getOutputStream());
    			out.flush();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}}
    	
    	
    	String receive(){
    		String msg="";
    		try {
    			msg = (String)in.readLine();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return msg;}
    	
    	void send(String msg)
    	{
    		try{
    			out.writeChars(msg);
    			out.flush();
    		}
    		catch(IOException ioException){
    			ioException.printStackTrace();
    		}}
    	
    	
    	void close(){
    		try {
    			in.close();
    			out.close();
    			socket.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}}
    	
    	
    	public static void main(String args[]) throws InterruptedException, IOException
    	{
    		
    		String ric="";
    		Server server = new Server(8888);
    		System.err.println("\nCONNESSO!");
    		server.send("Siamo collegati!\n");
    		while(true){
    			if(ric.equals("") || ric==null || ric.equals("chiudi"))
    			break;
    			ric=server.receive();
    			System.out.println("Ho ricevuto:"+ric);
    			}
    		System.err.println("Chiudo la connessione");
    		server.close();
    		}
    		
    }
    e del client:
    codice:
    import java.net.*;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.Socket;
    
    public class Client{
    	Socket socket;
    	DataOutputStream out;
    	DataInputStream in;
     	
    	Client(String address, int port){
    		try {
    			socket = new Socket(address, port);
    			System.err.println("Connesso a "+address+" alla porta "+port);
    			in = new DataInputStream(socket.getInputStream());  
    		    out = new DataOutputStream(socket.getOutputStream());
    			out.flush();
    			
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			System.err.println("Connessione rifiutata");
    		}}
    	
    	
    	String receive(){
    	String msg="";
    	try {
    		msg=(String)in.readLine();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}return msg;
    	}
    	
    	void send(String msg)
    	{
    		try{
    			out.write(2);
    			out.flush();
    		}
    		catch(IOException ioException){
    			ioException.printStackTrace();
    		}}
    	
    	void close(){
    		try {
    			in.close();
    			out.close();
    			socket.close();
    		} catch (IOException e) {
    			e.printStackTrace();}}
    	
    	
    	
    	
    	public static void main(String args[]) throws InterruptedException
    	{
    		Client client = new Client("localhost", 8888);
    		Thread.sleep(2000);
    		client.send("ciaoo");
    		Thread.sleep(2000);
    		client.send("come");
    		Thread.sleep(2000);
    		client.send("stai??");
    		Thread.sleep(2000);
    		client.send("chiudi");
    		client.close();
    	}
    }
    Dove può essere il problema?
    Grazie per l'attenzione, ciao!

  2. #2
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    il prblema sembra sia questa parte di codice, nel Server
    codice:
    if(ric.equals("") || ric==null || ric.equals("chiudi"))
    break;
    appena il Client si apre il Server si chiude

  3. #3
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    l'attesa in lettura devi farla prima del controllo

    codice:
    while(true){
    	ric=server.receive();
                 if(ric.equals("") || ric==null || ric.equals("chiudi"))
    	break;
                 etc etc
    così il primo messaggio sembra leggerlo poi da un nullpointer (il messaggio risulta comunque incomprensibile) lo sapevi che il metodo readLine() dell'oggetto DataInputStream è deprecato?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    codice:
    if(ric.equals("") || ric==null || ric.equals("chiudi"))
    Questa riga di codice è logicamente errata.
    Cosa succede se "ric" è nullo? Il primo test fa scatenare una eccezione e il programma termina con errore.

    Le condizioni vanno messe nell'ordine corretto (e magari è bene anche usare le parentesi):

    codice:
    if((ric == null) || ric.equals("") || ric.equals("chiudi"))
    Altra buona regola da seguire è quella di invertire variabile e costante nei test. L'istruzione sarebbe stata formalmente corretta se fosse stata scritta in questo modo:

    codice:
    if("".equals(ric) || (ric == null) || "chiudi".equals(ric))
    Non avrebbe mai potuto sollevare eccezioni.


    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

  5. #5
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    infartti è stata la seconda cosa che ho notato, il null pointer era proprio perchè ris era null

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.