简体   繁体   中英

Getting Null String when reading from a socket

I am trying to write a client-server system using Sockets in java, however I cannot seem to read data sent from the server to the client.

Here is the code for the client:

public class ClientSocket 
{
    Socket clientSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;


    // establish a connection to All Care's server application through socket 4444 (adjust localhost to reflect the IP address that the server
    // is being run from)
    public ClientSocket()
    {
        try
        {
            clientSocket = new Socket("localhost", 4445);

            out = new PrintWriter(clientSocket.getOutputStream());
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        }
        catch (IOException e)
        {
            System.out.println("Could not connect to All Care Server Application");
        }
    }

    public void closeClientSocket()
    {   
        try
        {
            clientSocket.close();
        }
        catch (IOException e)
        {
            System.out.println("Could not close connection to All Care Server Application");
        }
    }

    public String getMessageFromServer()
    {
        try
        {
            String input = in.readLine();

            return input;
        }
        catch (IOException e)
        {
            System.out.println("Could not read message from server");
        }

        return "No Data";
    }

    public void sendMessageToServer(String message)
    {
        out.write(message);
    }
}

And here is the Server code:

public class ArFileServer {

    public static void main(String[] args) 
    {
        ServerSocket serverSocket = null;
        boolean listening = true;

        try
        {
            serverSocket = new ServerSocket(4445);

            // infinite loop to continually listen for connection requests made by clients
            while (listening)
            {
                new ClientConnection(serverSocket.accept()).start();

                if (serverSocket != null)
                {
                    System.out.println("Connection to client established");
                }
            }

            serverSocket.close();
        }
        catch (IOException e)
        {
            System.out.println("Error could not create socket connection to port");
        }
    }
}

public class ClientConnection extends Thread
{
    private Socket socket = null;

    public ClientConnection(Socket socket) 
    {
        super("ClientConnection");
        this.socket = socket; 
    }

    // the thread that runs after a connection to the server has been accepted
    @Override
    public void run()
    {
        try
        {
            PrintWriter out = new PrintWriter(socket.getOutputStream());
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            sendMessagetoClient(out, "CONNECTION SUCCESS");

            // check login credentials sent from client to the server

            // if valid send back their encrypted password, otherwise output a login error message

            // wait for user input and then do various processes based on their requests

            in.close();
            out.close();
            socket.close();
        }
        catch (IOException e)
        {
            System.out.println("Client socket connection error");
        }
    }

    // sends a message to the client
    void sendMessagetoClient(PrintWriter out, String message)
    {
        out.write(message);
    } 

    // listens for a message from the client
    String getMessageFromClient(BufferedReader in)
    {      
        try
        {
            String input = in.readLine();
            return input;
        }
        catch (IOException e)
        {
            System.out.println("Could not read message from client");
        }

        return "No Data";
    }

And here is the line of code im using to see if the data is being sent.

System.out.println(clientSocket.getMessageFromServer());

In your sendMessageToClient() method, you need to flush:

void sendMessagetoClient(PrintWriter out, String message)
{
    out.write(message);
    out.flush();
} 

Or, when you create the PrintWriter , use the constructor with autoflush :

PrintWriter out = new PrintWriter(socket.getOutputStream(),true);

And when you write, instead of out.write(message) use printf() or println() .

There are several problems here.

  1. You are reading lines but you aren't writing lines.

  2. You aren't checking the result of readLine() for null, which means the peer has closed the connection, which means you must do likewise.

  3. You aren't flushing the PrintWriter after you write.

  4. You are closing things in the wrong order. You must close the output writer/stream you have attached to the socket. Doing that flushes it and then closes the input stream/reader and the socket. Doing this in the wrong order loses the flush. Once you've closed the output you don't need the other two closes.

  5. You are using PrintWriter, which swallows exceptions, across a network, where you need to know about exceptions and errors in communication, and you aren't checking for errors either. Use a BufferedWriter.

in the clint code you are not connecting with server socket. for clint socket connection

socket soc= new socket ("server host ip",port);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM