我目前正在创建一个从主机请求时间的简单客户端,并打印响应的内容。我对我所看到的内容感到非常困惑,因为输出是我以前从未见过的。这是我的客户代码,
import java.io.*;
import java.net.*;
import java.util.*;
/*
*
* Time tcp client
*/
public class TimeTcp {
public final static int TIME_PORT = 37;
public final static int SIZE = 1024;
public static void main(String[] args) throws IOException {
if(args.length < 1) {
System.out.println("usage: java TimeTcp host");
System.exit(1);
}
String host = args[0];
Socket socket = new Socket(host, TIME_PORT);
DataInputStream fromServer = new DataInputStream(
socket.getInputStream());
byte[] read = new byte[SIZE];
fromServer.read(read);
System.out.println(read.toString());
}
}
但是,我的输出如下所示:[B@4e25154f
从字面上看,就是这一切。
我究竟做错了什么?我应该转换一些东西吗?
谢谢!
编辑:感谢kolossus帮助我弄清楚我在看什么。但是,我应该打印出来的是从我调用的时间服务器获取的时间。我试图使用字节数组读取服务器发回的任何时间,然后将其读入单个变量,然后将其转换为Java可以使用的值(时间服务器协议发送32位无符号值,并且Java不支持那些),以便它可以打印回调用客户端的用户。有没有办法做到这一点?答案 0 :(得分:3)
您正在做什么(错误)
您尝试以错误的方式打印输出(byte
数组)
您正在看到的内容
每个java类都有的toString()
的默认实现。此实现打印对象的哈希码
你应该做什么
System.out.println(Arrays.toString(read));
答案 1 :(得分:0)
仅仅因为Java没有无符号数据类型并不意味着您无法使用无符号数据。你只需要有点创意。
试试这个:
import java.io.*;
import java.net.*;
import java.util.*;
import java.time.*;
/*
*
* Time tcp client
*/
public class TimeTcp {
public final static int TIME_PORT = 37;
public static void main(String[] args) throws IOException {
if(args.length < 1) {
System.out.println("usage: java TimeTcp host");
System.exit(1);
}
String host = args[0];
Socket socket = new Socket(host, TIME_PORT);
DataInputStream fromServer = new DataInputStream(
socket.getInputStream());
byte[] read = new byte[4];
fromServer.readFully(read);
long value = (((long)(read[0] & 0xFF)) << 24) |
(((long)(read[1] & 0xFF)) << 16) |
(((long)(read[2] & 0xFF)) << 8) |
((long)(read[3] & 0xFF));
System.out.println(Long.toString(value));
OffsetDateTime dt = OffsetDateTime.of(1900, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC).plusSeconds(value);
System.out.printlf(dt.toString());
}
}
可替换地:
import java.io.*;
import java.nio.*;
import java.net.*;
import java.util.*;
import java.time.*;
/*
*
* Time tcp client
*/
public class TimeTcp {
public final static int TIME_PORT = 37;
public static void main(String[] args) throws IOException {
if(args.length < 1) {
System.out.println("usage: java TimeTcp host");
System.exit(1);
}
String host = args[0];
Socket socket = new Socket(host, TIME_PORT);
DataInputStream fromServer = new DataInputStream(
socket.getInputStream());
byte[] read = new byte[4];
fromServer.readFully(read);
ByteBuffer buffer = ByteBuffer.wrap(read);
buffer.order(ByteOrder.BIG_ENDIAN);
long value = buffer.getInt() & 0xFFFFFFFFL;
System.out.println(Long.toString(value));
OffsetDateTime dt = OffsetDateTime.of(1900, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC).plusSeconds(value);
System.out.printlf(dt.toString());
}
}