简单的TCP连接程序,我在看什么,我该如何解决?

时间:2014-10-01 21:05:12

标签: java tcp

我目前正在创建一个从主机请求时间的简单客户端,并打印响应的内容。我对我所看到的内容感到非常困惑,因为输出是我以前从未见过的。这是我的客户代码,

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不支持那些),以便它可以打印回调用客户端的用户。有没有办法做到这一点?

2 个答案:

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