简单的Java echo服务器问题

时间:2012-06-11 19:23:15

标签: java sockets client echo

我正在尝试编写我的第一个套接字服务器,所以我决定从一个非常简单的东西开始,只是为了计算流程:)我正在编写一个简单的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基本套接字教程/等等,但我无法弄清楚是什么问题 - 我已成功写入服务器套接字但我似乎无法得到响应。

2 个答案:

答案 0 :(得分: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错误。

答案 1 :(得分:0)

请改为尝试:

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

另请注意,不需要writer.flush();,因为当您将true传递给PrintWriter构造函数的第二个参数时,它会使其成为自动刷新流。

相关问题