繁体   English   中英

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

[英]Getting Null String when reading from a socket

我正在尝试使用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";
    }

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

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

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

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

或者,在创建PrintWriter ,将构造函数与autoflush一起autoflush

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

并且在编写时,请使用printf()println()代替out.write(message) println()

这里有几个问题。

  1. 您正在阅读台词,但没有在写台词。

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

  3. 编写后,您无需刷新PrintWriter

  4. 您以错误的顺序关闭事物。 您必须关闭已附加到套接字的输出编写器/流。 这样做会冲洗它,然后关闭输入流/阅读器和套接字。 以错误的顺序执行此操作会丢失刷新。 关闭输出后,就不需要另外两个关闭。

  5. 您正在使用PrintWriter,它将通过网络吞下异常,您需要在该网络中了解通信中的异常和错误,而且也不会检查错误。 使用BufferedWriter.

在clint代码中,您未与服务器套接字连接。 用于克林特插座连接

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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