Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Client e server

  1. #1

    Client e server

    Ciao,vorrei creare un semplice server e un semplice client (per iniziare). Vorrei semplicemente che in base ad una lettera passata dal Client il server risposta con una stringa.
    Es.Il client scrive "a" ed il server risponde "Buongiorno"
    Ho provato a creare una connessione:
    codice:
    package comunicazione; 
     import java.awt.*;
     import java.lang.*;
     import java.io.*; 
     import java.net.*; 
     public class BaseConn {      
    TextArea commandArea, responseArea;     
    Socket socket = null;     
    PrintWriter os = null;     
    BufferedReader is = null;  
     public BaseConn(String host, String port, TextArea commandArea, TextArea responseArea) {  this.commandArea = commandArea;      
       this.responseArea = responseArea;                 
     try {socket = new Socket(host, Integer.parseInt(port));     
           os = new PrintWriter(socket.getOutputStream());        
           is = new BufferedReader(new InputStreamReader(socket.getInputStream()));             responseArea.append("***Connection established" + "\n");         
    } catch (Exception e)    { responseArea.append("Exception" + "\n");         }        
          }  
    
         public void send() {  os.println(commandArea.getText());    
                                    os.flush();     }      
    
         public void receive() { String inputLine;              
    try {  inputLine = is.readLine(); 
            responseArea.append(inputLine + "\n");  
     } catch (IOException e) {  responseArea.append("IO Exception" + "\n");         }    
     }    }
    un client:
    codice:
    package comunicazione;  
    import java.net.*; 
    import java.io.*; 
    public class SimpleClient{    public static void main(String args[]) throws IOException {       Socket s1;       
    InputStream s1in;       
    DataInputStream dis;         
    s1=new Socket("192.168.0.2",65000);        
    s1in=s1.getInputStream();        
    dis=new DataInputStream(s1in);        
    String st=new String(dis.readUTF());       
     System.out.println(st);         
    dis.close();      
      s1in.close();    
        s1.close();    } }
    ed un server:
    codice:
    package comunicazione;  
    import java.net.*; 
    import java.io.*; 
    public class SimpleServer {    
    public static void main(String args[]) {      
    ServerSocket s=null;     
      Socket s1;       
     String sendString="Buongiorno";     
      int slength=sendString.length();     
      OutputStream s1out;     
      DataOutputStream dos;      
     try {          s=new ServerSocket(65000);       
    } catch (IOException e) {}       
    while(true) {          
    try {             s1=s.accept();            
     s1out=s1.getOutputStream();           
      dos=new DataOutputStream(s1out);        
         dos.writeUTF(sendString);        
         dos.close();           
      s1out.close();           
      s1.close();      
       } catch (IOException e) {}       }    } }
    main:
    codice:
     package comunicazione;   
    import java.sql.*; 
    import java.io.*; 
    import java.net.*; 
    import java.util.*;
     import java.util.Vector; 
    import java.io.BufferedReader.*;  
    public class Main{   
    public static void main(String[] args){   
    Socket s1;      
     InputStream s1in;     
      DataInputStream dis;     
       try { BufferedReader in = new BufferedReader( new InputStreamReader( s1.getInputStream())); 
    System.out.println ("digita a"); 
    if(in.readLine().equals("a")){ String sendString="Buongiorno"; }     }catch (IOException e) { e.printStackTrace();   }   } }
    Però mi dice che s1 deve essere inizializzata, ma come?
    Non va bene la dichiarazione nella classe SimpleClient?
    Grazie

  2. #2
    Nessuno sa aiutarmi?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Non sono stato lì a guardare tutte le classi (che suggerisco di indentare meglio, che così è davvero un macello leggere il codice), ma ho visto la classe Main:

    codice:
    package comunicazione;   
    import java.sql.*; 
    import java.io.*; 
    import java.net.*; 
    import java.util.*;
     import java.util.Vector; 
    import java.io.BufferedReader.*;  
    public class Main{   
       public static void main(String[] args){   
          Socket s1;      // dichiarata e MAI inizializzata 
          InputStream s1in;     
          DataInputStream dis;     
          try {
             // qui usi "s1", ma non l'hai MAI inizializzata 
             BufferedReader in = new BufferedReader( new InputStreamReader( s1.getInputStream() ) );
             System.out.println ("digita a"); 
             if( in.readLine().equals("a") ){
                String sendString="Buongiorno";
             }
          }catch (IOException e) { e.printStackTrace();   }
       }
    }
    Poi, sinceramente, non ho ben capito a cosa ti serva una Socket all'interno della classe Main (visto che tutta la comunicazione, dalla connessione all'invio dei dati alla chiusura viene correttamente fatto nelle altre classi), ma questo lo vedrai da te...


    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

  4. #4
    Ciao, innanzitutto provo a scrivere meglio il codice:

    Simple server:
    codice:
    package comunicazione;  
    import java.net.*; 
    import java.io.*; 
    public class SimpleServer {    
    	public static void main(String args[]) {      
    	ServerSocket s=null;     
    	Socket s1;       
    	String sendString="Buongiorno";     
    	int slength=sendString.length();     
    	OutputStream s1out;     
    	DataOutputStream dos;      
    		try {          
    			s=new ServerSocket(65000);       
    		    } 
    	catch (IOException e) {}       
    	while(true) {          
    		try {  s1=s.accept();            
     		       s1out=s1.getOutputStream();           
      		       dos=new DataOutputStream(s1out);        
         		       dos.writeUTF(sendString);        
         			dos.close();           
      		s1out.close();           
      	s1.close();      
       		    } 
    catch (IOException e) {}       
    }
    }
    }
    Simple Client:

    codice:
    package comunicazione;  
    import java.net.*; 
    import java.io.*; 
    public class SimpleClient{ 
    	public static void main(String args[]) throws IOException {       
    		Socket s1;       
    		InputStream s1in;       
    		DataInputStream dis;         
    		s1=new Socket("192.168.0.2",65000);        
    		s1in=s1.getInputStream();        
    		dis=new DataInputStream(s1in);        
    		String st=new String(dis.readUTF());       
     		System.out.println(st);         
    		dis.close();      
      	s1in.close();    
        s1.close();    } 	
    			}
    BaseConn:
    codice:
    package comunicazione; 
     import java.awt.*;
     import java.lang.*;
     import java.io.*; 
     import java.net.*; 
     public class BaseConn {      
    		TextArea commandArea, responseArea;     
    		Socket socket = null;     
    		PrintWriter os = null;     	
    		BufferedReader is = null;  
     			public BaseConn(String host, String port, TextArea commandArea, TextArea responseArea) {  			this.commandArea = commandArea;      
       			this.responseArea = responseArea;                 
     			try {
    				socket = new Socket(host, Integer.parseInt(port));     
           				os = new PrintWriter(socket.getOutputStream());        
           				is = new BufferedReader(new InputStreamReader(socket.getInputStream()));             				responseArea.append("***Connection established" + "\n");         
    			} catch (Exception e)    
    		{ responseArea.append("Exception" + "\n");         }        
        		}  
    
         		public void send() {  os.println(commandArea.getText());    
                                   	      os.flush();     }      
    
         		public void receive() { String inputLine;              
    					try {  	
    						inputLine = is.readLine(); 
            					responseArea.append(inputLine + "\n");  
     					} catch (IOException e) {  responseArea.append("IO Exception" + "\n");}    
     				}    
    			}
    Tu mi scrivi che non è necessario il main.. Ma in questo caso dove devo inserire la condizione che se il Client scrive "a" il server risponde "buongiorno"?
    Scusa ma sono alle prime armi.
    Ciao e grazie.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da francesca8080
    Tu mi scrivi che non è necessario il main..
    No, ho detto che non ti serve a nulla (anzi, è completamente sbagliato) avere una Socket anche nel main... una socket che non potresti mai collegare (se già c'è una socket collegata a quell' IP / porta).

    Ma in questo caso dove devo inserire la condizione che se il Client scrive "a" il server risponde "buongiorno"?
    Scusa ma sono alle prime armi.
    Ciao e grazie.
    Ovviamente nel server: il server dovrebbe ricevere la stringa dal client, controllare cosa ha ricevuto e rispondere di conseguenza.

    Quello che non ho chiaro io è a cosa ti serva, nel concreto, la terza classe... se è una classe di supporto che deve solo ricevere un input dall'utente e dare istruzioni al client può anche andare bene (in ogni caso, una socket su questa classe non c'entra, comunque, proprio nulla).

    Altrimenti, semplicemente dovresti avere due applicazioni distinte: una che funge da server (che viene lanciata da qualche parte) e una che fa da client (che viene lanciata da un'altra parte).

    La server istanzia una ServerSocket.
    La client istanzia una Socket che si collega dove c'è il server in ascolto.
    La client chiede all'utente cosa inviare al server, quindi fa l'invio
    Il server riceve la stringa, controlla cosa ha ricevuto e agisce di conseguenza.

    Stop.


    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

  6. #6
    Ciao, ho ripulito un pò il mio codice.
    La classe client:

    codice:
    package comunicazione;
    
    import java.net.*;
    import java.io.*;
    public class SimpleClient{
       public static void main(String args[]) throws IOException {
          Socket s1;
          InputStream s1in;
          DataInputStream dis;
          s1=new Socket("192.168.0.2",65000);
          s1in=s1.getInputStream();
          dis=new DataInputStream(s1in);
          String st=new String(dis.readUTF());
          System.out.println(st);
    
           dis.close();
           s1in.close();
           s1.close();
       }
    }
    La classe server:

    codice:
    package comunicazione;
    
    import java.net.*;
    import java.io.*;
    public class SimpleServer {
       public static void main(String args[]) {
          ServerSocket s=null;
          Socket s1;
     
         if (s1=="a")  {
         String sendString="Buongiorno";
          int slength=sendString.length();
          OutputStream s1out;
          DataOutputStream dos;
          try {
             s=new ServerSocket(65000);
          } catch (IOException e) {}
          while(true) {
             try {
                s1=s.accept();
                s1out=s1.getOutputStream();
                dos=new DataOutputStream(s1out);
                dos.writeUTF(sendString);
                dos.close();
                s1out.close();
                s1.close();
            } catch (IOException e) {}
          }
       }}
    }
    Quando cerco di inserire la condizione nel server if (s1=="a") mi restituisce l'errore
    incomparable types:java.net.Socket and java.lang.String

    Quindi come dovrei definire la stringa di Input dal Client?
    Grazie.

  7. #7
    nessuno mi sa aiutare?

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da francesca8080
    Quando cerco di inserire la condizione nel server if (s1=="a") mi restituisce l'errore
    incomparable types:java.net.Socket and java.lang.String

    Quindi come dovrei definire la stringa di Input dal Client?
    Grazie.
    E cosa vorrebbe essere questo obbrobrio impronunciabile?

    s1 è un oggetto di tipo Socket che tu stai "confrontando" (l'ho messo tra virgolette apposta) con un oggetto di tipo String... cioè, stai cercando di controllare se un Autotreno è una Banana...

    Detto per inciso, il confronto fra oggetti non si fa usando l'operatore "= =", ma si usa il metodo equals() fornito da tutti gli oggetti.

    Ora, spiega per benino cosa vorresti fare con quel confronto privo di alcun significato...


    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

  9. #9
    Ciao, l'intento è quello di farsi restituire dal server una stringa stabilita quando il client invia una determinata stringa.
    Es. Client:"a" ---> Server:"Buongiorno"

    Ho modificato la classe SimpleServer come segue:

    codice:
    package comunicazione;
    
    import java.net.*;
    import java.io.*;
    public class SimpleServer {
       public static void main(String args[]) {
          ServerSocket s=null;
          Socket s1;
          String sendString="Buongiorno";
          int slength=sendString.length();
          OutputStream s1out;
          DataOutputStream dos;
         
    	 try {
             	s=new ServerSocket(65000);
          	     } catch (IOException e) {}
          while(true) {
             try {
                s1=s.accept();
                s1in=s1.getInputStream();
                String prima="a";
                	if (s1in.equals(prima) ){
                    System.out.println ("buongiorno");
                		}
                
                s1out=s1.getOutputStream();
                dos=new DataOutputStream(s1out);
                dos.writeUTF(sendString);
                dos.close();
                s1out.close();
                s1.close();
                  } catch (IOException e) {}
          	  	    }
       }
       }
    Ma mi restituisce l'errore "Cannot find simbol" sulle righe:
    s1in=s1.getInputStream();
    e
    if (s1in.equals(prima) ){

    Come risolvo?
    Ciao

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    E' ovvio che ti dia quell'errore... la stringa a cui fai riferimento non è stata dichiarata in nessun punto, quindi di fatto non esiste. Poi ti consiglio di leggere la documentazione riguardante gli stream in quanto l'inputstream non trasferisce stringhe ma byte. Per cui, o usi InputStreamReader/OutputStreamReader oppure ObjectOutputStream/ObjectInputStream

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.