Java Telnet按字符发送字符串

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(""

我写的代码可以向服务器发送消息。问题是,如果我在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(""))
        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自己的说法,它与我在这里发布的代码配合得很好)请定义“无法读取我的应用程序发送的消息”。服务器无法区分这两种情况。您一定是做了其他错误的事情,例如不正确或缺行终止。