【问题标题】:TCP server is unable to read data from clientTCP 服务器无法从客户端读取数据
【发布时间】:2021-09-05 18:33:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java sockets tcp tcpserver


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 2020-01-28
      • 1970-01-01
      • 2020-12-03
      • 2012-09-21
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多