如何从Java上的套接字读取多种类型的数据

问题描述 投票:0回答:1

我编写了一些文件传输应用程序。在客户端和服务器之间,我发送3种类型的数据:

1)一些“命令字”,例如READY_FOR_UPLOAD。

2)一些可序列化的数据

3)字节数组中的大文件。

我在服务器套接字上获得客户端连接,并为每个客户端创建新的线程。

    try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);
    InputStream inputStream = clientSocket.getInputStream();
    ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {}

我尝试使用资源创建这些流,没有问题。

我使用:

1]在“中”用于从客户端读取消息:

    String line;
    while ((line = in.readLine()) != null) {
      System.out.println(line);
    }

2)“发送”以发送消息。

3)“ inputStream”用于接收文件:

    try (FileOutputStream fileOutputStream = new  
              FileOutputStream("D:\\testDownload.zip");
         BufferedOutputStream bufferedOutputStream = new 
               BufferedOutputStream(fileOutputStream)
            ) {
                byte[] buffer = new byte[1024 * 100];
                int read;
                while ((read = inputStream.read(buffer)) != -1) {
                   bufferedOutputStream.write(buffer, 0, read);
                }

            }

4)“ objectInputStream”用于可序列化的数据:

    Object object;
    if ((object = objectInputStream.readObject()) != null) {
        if (object instanceof File) {
              File file = (File) object;
              System.out.println(file.getAbsolutePath());
              System.out.println(file.length());
          }
     }

虽然我分别使用它们-没问题。但是我首先需要阅读“命令字”,即在胎面方法运行开始时。

    public void run() {
    try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);
    InputStream inputStream = clientSocket.getInputStream();
    ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {
      String line;
     if ((line = in.readLine()) != null) {
      System.out.println(line);

     there i should try to read other types of data
    }
    }

如果这不是“命令字”,我可以尝试读取可序列化的数据或文件数据。但这是一个问题!我可能会尝试读取一行,但是它可能是文件数据可序列化数据的一部分,并且由于inputsream读取了“一对一”字节方法,因此我无法像读取可序列化或文件数据一样尝试读取它,因为输入不再完整,我在“ readLine()”中读取了一些数据。在尝试读取数据之前,我应该知道我收到的数据类型。怎么做?

java sockets serversocket
1个回答
0
投票

您需要创建一个协议-规定客户端和服务器之间如何交换信息。写入数据时,您可以指定要发送的数据类型及其大小。并且不要在Socket上使用ObjectInputStream和ObjectOutputStream-将数据转换为字节数组,这样您就可以知道在写入时大小是多少,然后再将其转换回去。以字节为单位发送数据。

© www.soinside.com 2019 - 2024. All rights reserved.