【问题标题】:How to process and decode incoming bytes from a TCP server如何处理和解码来自 TCP 服务器的传入字节
【发布时间】:2019-11-13 19:31:46
【问题描述】:

我目前正在开发一个 Java 控制台应用程序。它通过命令提示符运行,连接到用 python 编码的服务器应用程序,并通过 TCP 与该服务器通信。我的应用程序将“ISND”字符串发送到它接受的服务器,并返回服务器发送三个图像。图片发送格式为

实际上不包括“”。 “ISND”使用 ascii 编码为字节。 Size 是从 int 转换为字节的图像大小,无论图像大小如何,它总是由 3 个字节组成。对于每个单独的图像,都会发送此格式的消息。

我一直在使用 BufferedReader 来读取服务器响应,但此时,我不知道如何实际处理此消息。我搜索了将传入消息分成组件的方法,因为我知道前两部分的长度始终是固定的,但我找不到真正实现该目标的方法。

到了这种地步,感觉就像我要把头撞到墙上一样。因此,我需要任何更熟悉 Java 和 Socket 编程的人就如何处理这个问题提出建议。

我当前的代码

public class ImageLabeler {
/**
 * @param args
 */
public static void main(String[] args) {
    String IP = args[0];
    System.out.println(IP + "\n");

    String port = args[1];
    System.out.println(port + "\n");

    Socket clientSocket;
    DataOutputStream outToServer = null;
    BufferedReader inFromServer = null;

    String serverResponse;



    try {
        clientSocket = new Socket(IP, Integer.parseInt(port));
        outToServer = new DataOutputStream(clientSocket.getOutputStream());
        inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        System.out.println("Connection success\n");
    } catch (IOException ex) {
        System.out.println("Connection failed\n");
        System.exit(0);
    }

    PrintWriter writer = new PrintWriter(outToServer, true);

    try {
        //outToServer.writeBytes("USER bilkentstu\\n");
        //outToServer.flush();
        //System.out.println("check\n");
        writer.println("USER bilkentstu");

        serverResponse = inFromServer.readLine();
        System.out.println(serverResponse + "\n");

        writer.println("PASS cs421f2019");

        //outToServer.writeBytes("PASS cs421f2019\\r\\n");
        //outToServer.flush();

        serverResponse = inFromServer.readLine();
        System.out.println(serverResponse + "\n");

        writer.println("IGET");
        //This is where I need to handle the incoming Image messages.

        writer.println("EXIT");
    } catch (IOException ex) {
        Logger.getLogger(ImageLabeler.class.getName()).log(Level.SEVERE, null, ex);
    }
    System.exit(0);
}

}

【问题讨论】:

    标签: java tcp byte decoding


    【解决方案1】:

    不要使用缓冲阅读器。您需要编写代码,一次从套接字的 InputStream 读取一个字节的字符串。

    【讨论】:

    • 是的。设法弄清楚了。最终将 inputStreamReader(进入 BufferedReader)和 DataInputStream 绑定到套接字自己的 inputStream。当我收到图像文件响应时使用 DataInputStream 并使用 bufferedReader 处理其他所有内容,因为只有图像文件响应需要逐字节读取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2023-03-07
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多