我想编写一个套接字客户端,以将请求发送到服务器并获得响应。它有效,但不正确。
这是我的代码:
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。我认为,我的问题是函数
writeUTF
和readUTF
。所以我在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客户端也不会使用它们。