2

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

这是客户端的代码:

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());
4

3 回答 3

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()or println()

于 2012-07-19T03:50:34.753 回答
0

这里有几个问题。

  1. 你在读台词,但你不是在写台词。

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

  3. PrintWriter写完后你不会刷新。

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

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

于 2012-07-19T08:07:06.313 回答
-2

在 clint 代码中,您没有与服务器套接字连接。用于 clint 套接字连接

socket soc= new socket ("server host ip",port);
于 2012-07-19T03:44:06.213 回答