4

我正在尝试编写我的第一个套接字服务器,所以我决定从一些非常简单的东西开始,只是为了弄清楚流程:) 我正在编写一个简单的 java echo 服务器,但问题是(出于某种原因?! )我没有在客户端收到服务器响应,尽管请求是在服务器中收到的。

package poc.client;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
            final Socket socket = new Socket((String) null, 50000);

            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            final PrintWriter writer = new PrintWriter(
                    socket.getOutputStream(), true);
            writer.println("ala bala\r\n");
            writer.flush();
            writer.close();

            System.out.println(reader.readLine());
            System.out.flush();
        } catch (Exception ex) {
                Logger.getAnonymouseLogger().throwing(TAG, "main", ex);
        }

    }
}

服务器部分是

package poc.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    /**
     * debugging purposes only
     */
    @SuppressWarnings("unused")
    private static final String TAG = Server.class.getSimpleName();

    public static void main(String[] args) {
        try {
            final ServerSocket socket = new ServerSocket(50000);
            while (true) {
                final Socket clientSocket = socket.accept();
                final BufferedReader reader = new BufferedReader(
                        new InputStreamReader(clientSocket.getInputStream()));
                final PrintWriter writer = new PrintWriter(clientSocket
                        .getOutputStream(), true);

                writer.println(reader.readLine());
                writer.flush();
                writer.close();
            }
        } catch (IOException e) {
                Logger.getAnonymouseLogger().throwins(TAG, "main",ex);
        }

    }
}

我阅读了所有 Oracle 基本套接字教程/等,但我不知道出了什么问题 - 我已成功写入服务器套接字,但我似乎无法获得响应。

4

2 回答 2

2

在从套接字读取之前不要关闭写入器。以下代码有效

final Socket socket = new Socket((String) null, 50000);

            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            final PrintWriter writer = new PrintWriter(
                    socket.getOutputStream(), true);
            writer.println("ala bala\r\n");

            System.out.println(reader.readLine());            
            //writer.flush();
            writer.close();

根据 close() 方法的javadoc:

关闭流并释放与其关联的任何系统资源。关闭以前关闭的流没有效果。

看起来如果您关闭流,底层套接字也会关闭。您可以通过在当前代码中打印堆栈跟踪来验证这一点。它给出了java.net.SocketException: socket closed错误。

于 2012-06-11T21:37:08.573 回答
0

试试这个:

Socket socket = new Socket(InetAddress.getLocalHost(), 50000);

另请注意,没有必要,writer.flush();因为您在传递truePrintWriter构造函数的第二个参数时将其设为自动刷新流。

于 2012-06-11T19:38:18.750 回答