套接字输出流和输入流的问题

Problems with socket outputstream and inputstream

我正在尝试使用套接字在 phone 和 pc 之间开发客户端-服务器连接。在开发过程中,我遇到了一个问题,目前还无法修复。问题出在输出流上。我使用 ObjectoutputStream 将 String 数组发送到客户端,当我使用此代码时它有效:

try
    {
        // отправка пакета с файлами
        DataInputStream dir = new DataInputStream(conn.getInputStream());
        OutputStream dos = conn.getOutputStream();
        ObjectOutputStream objectOutput = new ObjectOutputStream(dos);
        byte messageType = dir.readByte();
        switch(messageType) {
        case 1:
            try {
                textArea.append("\nClient sends a command: " + dir.readUTF());
                objectOutput.writeObject(results);
                objectOutput.close();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }               
        dir.close();
    } catch (IOException e) {
        ......

但是当我将 ObjectOutputStream 移动到切换器时:

try
    {
        // отправка пакета с файлами
        DataInputStream dir = new DataInputStream(conn.getInputStream());
        OutputStream dos = conn.getOutputStream();
        byte messageType = dir.readByte();
        switch(messageType) {
        case 1:
            try {
                ObjectOutputStream objectOutput = new ObjectOutputStream(dos);
                textArea.append("\nClient sends a command: " + dir.readUTF());
                objectOutput.writeObject(results);
                objectOutput.close();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }               
        dir.close();
    } catch (IOException e) {
        ....

我的程序死机了。我需要这样做,因为我还需要执行其他命令,例如发送和接收文件。这个问题有什么解决方案吗?

它冻结在哪一行?似乎从输入流中读取会导致输出流阻塞,直到所有内容都被消耗掉。查看您的 conn 对象的文档。这是什么class?也许在创建 ObjectOutputStream 之前移动 dir.readUTF() 调用可能会解决它。

这两种方法都行不通。关闭 ObjectOutputStream 将关闭套接字。您需要在套接字的整个生命周期内保持打开状态。所以无论如何把它移到机箱里都是徒劳的。

但是你的代码没有意义。您正在使用 ObjectOutputStream, 编写,但您从对等方读取的只是一个字节。如果您正在编写对象,则需要 读取 个对象,使用 ObjectInputStream, 而不是 DataInputStream, 并且在同时使用对象输入和输出流时,您必须始终构造ObjectOutputStream首先,两端要安全。

我解决了一个问题。我只是为它使用 BufferedReader & Writer,因为它也将用于传输文件。 所以现在代码工作正常,看起来像这样:

// отправка пакета с файлами
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), ENCODING));
            String messageType = br.readLine();
            switch(messageType) {
            case "connect": {
                List<String> results = new ArrayList<String>();

                File[] files = new File("C:/Tenzor_Denis/ServerFiles/").listFiles();
                //If this pathname does not denote a directory, then listFiles() returns null. 

                for (File file : files) {
                    if (file.toString().endsWith(".txt")) {
                        results.add(file.getName());
                    }
                }

                try {
                    for(int i = 0; i < results.size(); i++) {
                        bw.write(results.get(i));
                        bw.newLine();
                        //textArea.append(" " + results.get(i));
                    }
                    textArea.append("\nClient sends a command: " + messageType);

                } catch(Exception e) {
                    e.printStackTrace();
                }
                bw.close();
                br.close();
            }
            break;
            }
        }

感谢大家的回答。