TCP 服务器无法从客户端读取数据

时间:2021-06-22 06:59:57

标签: java sockets tcp tcpserver

我有以下客户端服务器通信器:

public class ServerAdapter
{
    private static final int serverPort = 8888;
    private static final String host = "localhost";
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    private void startConnection(String host, int port) throws IOException {
        clientSocket = new Socket(host, port);
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    }

    private String sendMessage(String msg) throws IOException {
        out.println(msg);
        String resp = in.readLine();
        return resp;
    }

    private void stopConnection() throws IOException {
        in.close();
        out.close();
        clientSocket.close();
    }
    public double sendServerForexRequest(Request clientRequest) throws IOException {
        startConnection(host, serverPort);
        String result = sendMessage(clientRequest.toString());
        stopConnection();
        return Double.parseDouble(result);
    }

调用sendServerForexRequest时,客户端成功建立连接,成功发送消息,但在尝试回读时卡住。

这是因为,根据调试,服务器端在尝试从客户端读取时卡住了,即使客户端已经发送了数据:

import java.io.*;
import java.net.Socket;
import java.util.stream.Collectors;

public class UserRequestHandlerThread extends Thread
{
    Socket userSocket;
    public UserRequestHandlerThread(Socket userSocket)
    {
        this.userSocket = userSocket;
    }
    @Override
    public void run() {
        ForexRate forexRate = new ForexRate();
        InputStream input = null;
        try {
            input = userSocket.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));

        String requestString = null;
        try {
            requestString = reader.lines().collect(Collectors.joining()); //RIGHT HERE
        } catch (Exception ex)
        {
            System.out.println(ex.getMessage());
        }
        Request request = Request.fromString(requestString);
        double exchangeResult = forexRate.rate(request.getFrom(), request.getTo()) * request.getAmount();
        OutputStream outputStream = null;
        try {
            outputStream = userSocket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        PrintWriter streamWriter = new PrintWriter(outputStream, true);
        streamWriter.print(exchangeResult);
        try {
            userSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我不知道为什么会这样。我检查了互联网上的多个来源,它们似乎都以完全相同的方式编写客户端和服务器端。这太奇怪了。

为什么服务器无法从客户端读取?

1 个答案:

答案 0 :(得分:0)

发现了。请勿使用 reader.lines().collect(Collectors.joining());。改用 char[] 缓冲方法。