通过telnet.exe与Java服务器套接字通信

时间:2013-12-25 22:02:55

标签: java sockets telnet

我正在编写一个简单的服务器来试验服务器套接字和telnet.exe

public static void main(String[] args) throws IOException {
    String line;
    ServerSocket ss = new ServerSocket(5555);
    Socket socket = ss.accept();
    System.out.println("Waiting for a client...");
    InputStream sin = socket.getInputStream();
    OutputStream sout = socket.getOutputStream();
    DataInputStream in = new DataInputStream(sin);
    DataOutputStream out = new DataOutputStream(sout);
    out.writeUTF("\u001B[2J");
    out.writeUTF("Hello client\r\n");
    line = in.readUTF();
    System.out.println("The dumb client just sent me this line : " + line);
    System.out.println("I'm sending it back...");
    out.writeUTF(line);
    out.flush();
    System.out.println("Waiting for the next line...");
    System.out.println();
}

现在我正在运行此服务器并通过telnet.exe与他联系。没关系。但是,当我向服务器发送消息时,我不会收到这个消息:

enter image description here

为什么它不起作用?

2 个答案:

答案 0 :(得分:3)

telnet客户端使用换行符终止每个输入行。但DataInputStream不会将此识别为输入字符串的终止符,因为DataInputStream用于二进制数据。

  1. 使用InputStreamReader包裹您的输入流,将其作为基于字符的输入流处理。
  2. 然后将其包裹在BufferedReader中。这样做的好处是,在程序执行时,输入流可以在后台由套接字填充。它还提供了一些方便的实用方法,如下所示。
  3. 使用readLine方法,该方法读取数据直至找到换行符。
  4. 像这样:

    BufferedReader inputReader = new BufferedReader(new InputStreamReader(in));
    [...]
    line = inputReader.readLine();
    

    对于基于文本的新行终止消息输出回客户端,您应该使用BufferedReader的输出模拟,即PrintWriter

答案 1 :(得分:0)

DataInput用于读取二进制文件。

来自Javadoc的readUTF()

  

读入使用修改后的UTF-8格式编码的字符串。 readUTF的一般契约是它读取以修改的UTF-8格式编码的Unicode字符串的表示;然后将此字符串作为String返回。

     

首先,读取两个字节并用于构造无符号的16位整数,其方式与readUnsignedShort方法完全相同。此整数值称为UTF长度,并指定要读取的其他字节数。然后通过将它们分组考虑将这些字节转换为字符。每个组的长度是从组的第一个字节的值计算的。组后面的字节(如果有)是下一组的第一个字节。

这意味着前两个字节必须具有以下UTF字符串的二进制长度。

您在前两个字节输入kj之类的内容,因此长度类似于25000字节,即您没有输入那么多,这就是它不返回的原因。


您想要的是能够使用BufferedReader和PrintWriter等类读取/写入文本