Java Telnet按字符发送字符串
我写的代码可以向服务器发送消息。问题是,如果我在Wireshark中捕获通信,则从应用程序发送的字符串消息如下所示:Java Telnet按字符发送字符串,java,networking,network-programming,telnet,wireshark,Java,Networking,Network Programming,Telnet,Wireshark,我写的代码可以向服务器发送消息。问题是,如果我在Wireshark中捕获通信,则从应用程序发送的字符串消息如下所示: hello - 1 packet h - 1 packet e - 1 packet l - 1 packet l - 1 packet o - 1 packet public void sendMessage(String message) { for (String ch : message.split(""
hello - 1 packet
h - 1 packet
e - 1 packet
l - 1 packet
l - 1 packet
o - 1 packet
public void sendMessage(String message) {
for (String ch : message.split(""))
sendPacket(ch);
sendPacket("\r\n");
}
public void sendPacket(String payload) {
if (out != null && !out.checkError()) {
out.print(payload);
out.flush();
Log.i("Terminal", "Message sent.");
}
}
如果我检查从Telnet cmd发送的相同消息,则终端消息如下所示:
hello - 1 packet
h - 1 packet
e - 1 packet
l - 1 packet
l - 1 packet
o - 1 packet
public void sendMessage(String message) {
for (String ch : message.split(""))
sendPacket(ch);
sendPacket("\r\n");
}
public void sendPacket(String payload) {
if (out != null && !out.checkError()) {
out.print(payload);
out.flush();
Log.i("Terminal", "Message sent.");
}
}
所以最后它一个字符一个字符地发送整个字符串。服务器可以从cmd Telnet终端读取消息并进行回复,但无法读取从我的应用程序发送的消息。有什么方法可以发送这样的字符串吗?我不是在为服务器编程。我只在客户端编程,所以服务器必须能够正确读取消息。非常感谢
PrintWriter out;
BufferedReader in;
public void run() {
// TODO Auto-generated method stub
try {
InetAddress serverAddr = InetAddress.getByName(hostname);
// create a socket to make the connection with the server
socket = new Socket(serverAddr, port);
Log.i("Terminal", "Socket connecting");
try {
// send the message to the server
out = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream())), true);
Log.i("Terminal", "Connected.");
// receive the message which the server sends back
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
}catch...
}catch...
}
//send code
public void sendMessage(String message) {
if (out != null && !out.checkError()) {
out.println(message);
out.flush();
Log.i("Terminal", "Message sent.");
}
}
为什么不单独发送每个字符 大概是这样的:
hello - 1 packet
h - 1 packet
e - 1 packet
l - 1 packet
l - 1 packet
o - 1 packet
public void sendMessage(String message) {
for (String ch : message.split(""))
sendPacket(ch);
sendPacket("\r\n");
}
public void sendPacket(String payload) {
if (out != null && !out.checkError()) {
out.print(payload);
out.flush();
Log.i("Terminal", "Message sent.");
}
}
您说过一切正常,但如果您将来遇到数据包合并问题,您可以通过添加以下行禁用Nagle算法:
socket.setTcpNoDelay(true);
就在这一次之后:
socket = new Socket(serverAddr, port);
这段代码将单独发送每个字符,但不会将服务器端的所有字符串放在一起。像这样:我修改了一点。在发送每个字符和换行符之前,现在它只在发送所有字符后发送换行符。现在试试看它是否有效。我认为问题是服务器端仍然只接收字符,而服务器不知道所有字符组成一条消息。@MikeB您解决了一个小问题。您没有解决这个答案本身存在的主要问题,这使它完全无效。@EJP OP希望他的代码像telnet一样工作。Telnet也受到同样的TCP数据包合并的影响,不是吗?因此,如果他正在与之通信的服务器与telnet配合良好,为什么它与我在这里发布的代码配合不好呢?(提示:根据OP自己的说法,它与我在这里发布的代码配合得很好)请定义“无法读取我的应用程序发送的消息”。服务器无法区分这两种情况。您一定是做了其他错误的事情,例如不正确或缺行终止。