Java OutputStream/TelnetClient 不能写超过 1955 个字符的字符串
Java OutputStream/TelnetClient can't write string longer than 1955 characters
我必须创建一个客户端,它从套接字接收请求并将它们发送到我们的 telnet 遗留服务器,然后 return 服务器响应。在我们最近意识到我发送的一些命令在 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;
}
我不知道这些对象,但你为什么不在消息的开头放一个字符,表示这是否是消息的结尾。因为发送一个巨大的字符串看起来不太安全。
示例:字符"E"表示结束,字符"N"表示未结束。
因此您的客户端可以继续接收消息并将它们连接成一个大字符串,同时它没有接收到带有字符 "E" 的消息。
示例:
正在接收... "NTheWorld..."
创建一个字符串"strMessage";
正在接收... "NBurnYesterday..."
将 receivedMessage 与 strMessage 连接起来;
正在接收... "NTodayApple..."
将 receivedMessage 与 strMessage 连接起来;
正在接收... "ETheEnd"
字符串完成,我执行下一个操作。
(抱歉拼写错误)
经过一番修改后,我认为这根本不是客户端问题。我拿了你的客户端代码并基于它编写了一个测试客户端。然后我写了一个(非常)基本的示例服务器,它打印出传入的消息和 returns 一个 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();
}
}
}
我必须创建一个客户端,它从套接字接收请求并将它们发送到我们的 telnet 遗留服务器,然后 return 服务器响应。在我们最近意识到我发送的一些命令在 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;
}
我不知道这些对象,但你为什么不在消息的开头放一个字符,表示这是否是消息的结尾。因为发送一个巨大的字符串看起来不太安全。
示例:字符"E"表示结束,字符"N"表示未结束。
因此您的客户端可以继续接收消息并将它们连接成一个大字符串,同时它没有接收到带有字符 "E" 的消息。
示例: 正在接收... "NTheWorld..." 创建一个字符串"strMessage"; 正在接收... "NBurnYesterday..." 将 receivedMessage 与 strMessage 连接起来; 正在接收... "NTodayApple..." 将 receivedMessage 与 strMessage 连接起来; 正在接收... "ETheEnd" 字符串完成,我执行下一个操作。
(抱歉拼写错误)
经过一番修改后,我认为这根本不是客户端问题。我拿了你的客户端代码并基于它编写了一个测试客户端。然后我写了一个(非常)基本的示例服务器,它打印出传入的消息和 returns 一个 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();
}
}
}