从套接字读取时获取Null字符串

时间:2012-07-19 03:36:51

标签: java sockets client-server

我正在尝试使用java中的套接字编写客户端 - 服务器系统,但是我似乎无法读取从服务器发送到客户端的数据。

以下是客户端的代码:

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);
    }
}

这是服务器代码:

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";
    }

以下是用于查看数据是否正在发送的代码行。

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

3 个答案:

答案 0 :(得分:2)

sendMessageToClient()方法中,您需要刷新:

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

或者,当您创建PrintWriter时,请使用带autoflush的构造函数:

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

当你写作时,而不是out.write(message)使用printf()println()

答案 1 :(得分:0)

这里有几个问题。

  1. 你正在读行,但你不是在写行。

  2. 您没有检查readLine()的结果是否为null,这意味着对等方已关闭连接,这意味着您必须这样做。

  3. 写完后你没有冲洗PrintWriter

  4. 您正在以错误的顺序关闭事物。您必须关闭已连接到套接字的输出编写器/流。执行此操作会将其刷新,然后关闭输入流/读取器和套接字。以错误的顺序执行此操作会丢失刷新。关闭输出后,您不需要关闭其他两个。

  5. 您正在使用PrintWriter,在网络中吞下异常,您需要了解通信中的异常和错误,并且您也没有检查错误。使用BufferedWriter.

答案 2 :(得分:-2)

您没有与服务器套接字连接的clint代码中的

。 用于客户端套接字连接

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