views:

15

answers:

2

Hi guys,

I am trying to make a simple Client-Server application but when I execute the code I get an exception that the client cannot get the socket's input stream.Please, take a look to my code and try to help.Thanks:)

P.S:Sorry for the messy code.Execute it as two different applications.

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;


public class SimpleClient //implements Runnable 
{
   private ObjectOutputStream output; // output stream to server
   private ObjectInputStream input; // input stream from server
   private String message = ""; // message from server
   private String chatServer="localhost"; // host server for this application
   private Socket client; // socket to communicate with server

   public void runClient() 
   {
      try // connect to server, get streams, process connection
      {
         connectToServer(); // create a Socket to make connection
         getStreams(); // get the input and output streams
         processConnection(); // process connection
      } // end try
      catch(IOException ioe)
      {
          ioe.printStackTrace();
      }
      finally 
      {
        // closeConnection(); // close connection
      } // end finally
   }

    private void closeConnection()
    {
        try 
      {
         output.close(); // close output stream
         input.close(); // close input stream
         client.close(); // close socket
      } // end try
      catch ( IOException ioException ) 
      {
         ioException.printStackTrace();
      } // end catch
   } // end method closeConnection


   private void connectToServer() throws IOException
   {      
      System.out.println( "Attempting connection\n" );

      // create Socket to make connection to server
      client = new Socket( InetAddress.getByName( chatServer ), 12345 );

      // display connection information
      System.out.println( "Connected to: " + 
         client.getInetAddress().getHostName() );
   } // end method connectToServer



   private void getStreams() throws IOException
   {
      // set up output stream for objects
      output = new ObjectOutputStream( client.getOutputStream() );         
      output.flush(); // flush output buffer to send header information

      // set up input stream for objects
      input = new ObjectInputStream( client.getInputStream() );     
      System.out.println( "\nGot I/O streams\n" );
   } // end method getStreams

    private void processConnection() throws IOException
    {

     do { 
         try // read message and display it
         {
            message = ( String ) input.readObject(); // read new message
            System.out.println( "\n" + message ); // display message
         } // end try
         catch ( ClassNotFoundException classNotFoundException ) 
         {
            System.out.println( "\nUnknown object type received" );
         } // end catch

      } while ( !message.equals( "SERVER>>> TERMINATE" ) );
   } // end method processConnection

    public String toString()
{
    return "client connected to "+chatServer;
}



public static void main(String []args)
{
  SimpleClient c= new SimpleClient();
  c.runClient();

}



    }

//-------------servers starts here

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;


import java.util.ArrayList;

public class SimpleServer //implements Runnable
{
   private ObjectOutputStream output; // output stream to client
   private ObjectInputStream input; // input stream from client
   private ServerSocket server; // server socket
   private Socket connection; // connection to client  
   private int counter=1; //counts connections
   ArrayList<SimpleClient> list;

 /***
  * Runs forever and takes care of alla
  */
   public void runServer()
   {
       try // set up server to receive connections; process connections
      {
         server = new ServerSocket( 12345, 100 ); // create ServerSocket

         while ( true ) 
         {
            try 
            {
               waitForConnection(); // wait for a connection
               getStreams(); // get input & output streams
               processConnection(); // process connection
            } // end try
            catch ( Exception Exception ) 
            {
               System.out.println( "\nSomething bad happened" );
            } // end catch
            finally 
            {
               closeConnection();
               counter++; //  close connection

            } // end finally
   }
       }

      catch ( IOException ioException ) 
      {
         System.out.println("An io error occured while creating a server-socket");
         ioException.printStackTrace();
      } // end catch
   } // end method runServer

   /***
    * Waits for a client's request for connection
    */
   public void waitForConnection()
   {
        try
        {
            connection = server.accept();
            System.out.println("Client with IP and hostname "+connection.getInetAddress().getHostName());
        } catch (IOException ex)
        {
            System.out.println("An error makes connection impossible");
            ex.printStackTrace();
        }

   }


   /***
    * Makes the interconnection of client's and server's stream's
    */
   public void getStreams()
   {
       try
       {

       output=(ObjectOutputStream) connection.getOutputStream();
       input=(ObjectInputStream) connection.getInputStream();
       output.flush();
       System.out.println("Got IO Streams, hell yeah ");

       }

       catch(IOException ioe)
       {
           System.out.println("Cannot get streams");
           ioe.printStackTrace();
       }

   }

   /***
    * Terminates connection
    */
   public void closeConnection()
   {
        try
        {
            output.flush();
            output.close();
            input.close();
        } catch (IOException ex)
        {
            ex.printStackTrace();
        }
   }

   /***
    * Receives messages from client
    */
    public void processConnection()
    {
        String message="Connection successful";

        do // process messages sent from client
      { 
         try // read message and display it
         {
            message = ( String ) input.readObject(); // read new message
            System.out.println("CLIENT>>> "+message);

         } // end try
         catch ( ClassNotFoundException classNotFoundException ) 
         {
            System.out.println( "\nUnknown object type received" );
         } 

         catch(IOException ioe)
         {
             System.out.println("Cannot receive message from clint");
             ioe.printStackTrace();
         }

      } while ( !message.equals( "CLIENT>>> TERMINATE" ) );


    }

    /***
     * Sends data to client
     * @param message
     */
    public void sendData(String message)
    {

        try // send object to client
      {

         output.writeObject( "SERVER>>> " + message );
         output.flush(); // flush output to client
         System.out.println("SERVER>>> " + message);
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
    }


    public String toString()
    {
        return "this is a simple server with a total of "+counter+" connections";
    }



   public static void main(String []args)
{
  SimpleServer c= new SimpleServer();
  c.runServer();

}


}
+1  A: 

Your server is just casting the objects returned by Socket.getOutputStream() and Socket.getInputStream() to object streams. Instead, it must construct the object streams in the same way that your client does by using "new ObjectInputStream()" and "new ObjectOutputStream()". Remember to flush the server's ObjectOutputStream.

Steve Emmerson
As I do in the client side? "output = new ObjectOutputStream( client.getOutputStream() );"
DarkFire21
A: 

Ok, the initial problem is solved and I have one more question.How can I have an inputstream on the client side reading from keyboard and passing the read data to the client's outputstream?I think with a byte array but it would be greta if you could give a sample code.

DarkFire21