【问题标题】:Telnet send string by characterTelnet 按字符发送字符串
【发布时间】:2014-04-05 04:37:10
【问题描述】:

我写的代码可以向服务器发送消息。问题是如果我在 Wireshark 中捕获通信,我的应用程序发送的字符串消息如下所示:

hello    - 1 packet

如果我检查从 Telnet cmd 发送的相同消息,终端消息如下所示:

h      - 1 packet
e      - 1 packet
l      - 1 packet
l      - 1 packet
o      - 1 packet

所以最后它按字符发送了整个字符串。服务器可以从 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.");
        }
}

【问题讨论】:

  • 请定义“无法阅读从我的应用程序发送的消息”。服务器无法区分这两种情况。您一定是做错了什么,例如不正确或缺少线路终止。

标签: java networking network-programming telnet wireshark


【解决方案1】:

为什么不单独发送每个字符?

类似这样的:

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);

【讨论】:

  • 此代码将单独发送每个字符,但不会将服务器端的所有字符串放在一起。像这样:link
  • 我稍微修改了一下。之前它发送每个字符和一个换行符,现在它只在发送所有字符后发送一个换行符。现在试试看它是否有效。
  • 我认为问题是服务器端仍然只收到字符并且服务器不知道所有字符一起形成一条消息。
  • @MikeB 你修复了一件小事。您没有解决此答案本质上错误的主要问题,这完全使其无效。
  • @EJP OP 希望他的代码能够像 telnet 一样工作。 Telnet 也是同样的 TCP 数据包合并,不是吗?因此,如果他正在与之通信的服务器可以通过 telnet 正常工作,为什么我在此处发布的代码不能正常工作? (提示:根据 OP 本人的说法,我在此处发布的代码确实可以正常工作)
猜你喜欢
  • 2020-08-16
  • 2019-07-19
  • 2012-07-28
  • 2017-01-07
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多