Java OutputStream / TelnetClient不能写超过1955个字符的字符串

问题描述 投票:1回答:2

我必须创建一个客户端,该客户端从套接字获取请求,并将其发送到我们的telnet旧式服务器,并返回服务器响应。一直很好,直到我们最近才意识到我发送的某些命令被截断为1955个字符。一切设置的方式是,我向服务器发送了1行命令,然后又发送了1行响应。我想不通一种方法,可以通过TelnetClient通过DataOutputStream发送更长的命令。我做错了吗?还是仅仅是这些对象之一的限制?

public void connect() {
    try {
        tc = new TelnetClient();
        TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler("VT100", false, false, true, false);
        EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true, false);
        SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true, true, true);
        try {
            tc.addOptionHandler(ttopt);
            tc.addOptionHandler(echoopt);
            tc.addOptionHandler(gaopt);
        } catch (InvalidTelnetOptionException e) {
            ServerConsole.log(e.getMessage());
        }
        tc.connect("192.168.1.8", 2010);
        in = new DataInputStream(tc.getInputStream());
        out = new DataOutputStream(tc.getOutputStream());
        login();
    } catch (IOException ex) {
        ServerConsole.log(ex.getMessage());
    }
}

//This is a watered down version of my write method just to show the basic idea of whats happening
public String write(String command) {
    String finalCommand = command+"\n";
    byte[] comm = finalCommand.getBytes();
    out.write(comm);
    out.flush();
    response = in.readLine();
    response = in.readLine();
    return response;
}
java telnet apache-commons-net dataoutputstream
2个回答
1
投票

经过一番修补后,我认为这根本不是客户端问题。我拿了您的客户端代码,并根据它编写了一个测试客户端。然后,我写了一个(非常)基本的示例服务器,它打印出传入的消息并返回一个ACK。

即使将请求大小提高到100k也不会导致来自客户端的消息被截断。您可能需要仔细查看正在联系的服务器如何处理传入数据。

客户

public class TelnetClientTest {
    public static String LOCALHOST = "127.0.0.1";
    public static int PORT = 5003;

    public static void main(String[] args) throws Exception {
        TelnetClient tc = new TelnetClient();
        TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler("VT100", false, false, true, false);
        EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true, false);
        SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true, true, true);
        try {
            tc.addOptionHandler(ttopt);
            tc.addOptionHandler(echoopt);
            tc.addOptionHandler(gaopt);
        } catch (InvalidTelnetOptionException e) {
            e.printStackTrace();
        }
        tc.connect(LOCALHOST, PORT);
        DataInputStream in = new DataInputStream(tc.getInputStream());
        DataOutputStream out = new DataOutputStream(tc.getOutputStream());

        StringBuilder sb = new StringBuilder();
        for (int i=0; i<1000; i++) {
            sb.append("0123456789");
        }
        sb.append("\n");
        out.write(sb.toString().getBytes());
        out.flush();
        System.out.println(in.readLine());
        tc.disconnect();
    }
}

服务器

public class ServerSocketExample {
    private static ServerSocket server;
    private static int PORT = 5003;

    public static void main(String[] args) throws Exception {
        server = new ServerSocket(PORT);
        while (true) {
            System.out.println("Waiting for clients...");
            Socket s = server.accept();
            System.out.println("Client connected: " + s.getLocalAddress().getHostName());

            BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String request = reader.readLine();
            System.out.println("Client says ("+request.length()+"): " + request);

            System.out.println("Sending ACK response\n");
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            writer.write("ACK\n");
            writer.flush();
        }
    }
}

2
投票

我不知道这些对象,但是为什么不在消息的开头放置一个字符,它表示这是否是消息的结尾。因为发送巨大的字符串看起来不太安全。

示例:字符“ E”表示END,字符“ N”表示NotEnded。

因此,您的客户端可以继续接收该消息,并在不接收带有字符“ E”的消息时将它们串联成一个大字符串。

示例:正在接收...“ NTheWorld ...”创建一个字符串“ strMessage”;正在接收...“ NBurnYesterday ...”将receiveMessage与strMessage连接;正在接收...“ NTodayApple ...”将receiveMessage与strMessage连接;正在接收...“ ETheEnd”字符串完成,我执行下一个操作。

(抱歉,拼写错误)

© www.soinside.com 2019 - 2024. All rights reserved.