我想编写一个套接字客户端,以将请求发送到服务器并获得响应。它有效,但不正确。
这是我的代码:

public String send(final String data) {
        Socket client = null;
        String response = null;

        try {
            client = new Socket(this.host, this.port);

            final OutputStream outToServer = client.getOutputStream();
            final DataOutputStream out = new DataOutputStream(outToServer);
            out.writeUTF(data);

            final InputStream inFromServer = client.getInputStream();
            final DataInputStream in = new DataInputStream(inFromServer);
            response = in.readUTF();
        } catch (final IOException e) {
            this.log.error(e);
            this.log.error("Sending message to server " + this.host + ":" + this.port + " fail", e);
        } finally {
            if (client != null) {
                try {
                    client.close();
                } catch (final IOException e) {
                    this.log.error("Can't close socket connection to " + this.host + ":" + this.port, e);
                }
            }
        }
        if (StringUtils.isBlank(response)) return null;
        return response;
    }


问题是:我没有得到in.readUTF()的完整答复。我总是得到与发送数据长度相同的响应(变量data)。我已经使用其他GUI客户端进行了测试,并获得了完整的响应。因此,这不是服务器的问题。
有人知道我做错了吗?

更新

感谢EJP和Andrey Lebedenko。我认为,我的问题是函数writeUTFreadUTF。所以我在try块中编辑了我的代码,因此:

        Charset charset = Charset.forName("ISO-8859-1");
        final OutputStream outToServer = client.getOutputStream();
        final DataOutputStream out = new DataOutputStream(outToServer);
        out.write(data.getBytes(charset));

        final InputStream inFromServer = client.getInputStream();
        final BufferedReader in = new BufferedReader(new InputStreamReader(inFromServer, charset));
        response = in.readLine();


现在就可以了。

最佳答案

如果它可以与Telnet配合使用,则根据您的评论,服务器未使用readUTF(),因此您的writeUTF()已经错误,因此服务器也不太可能使用writeUTF(),这将使您的也是错误的。您不能任意使用这些方法:它们只能在它们之间交换数据。

我敢打赌,您的GUI客户端也不会使用它们。

10-05 18:47