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

时间:2015-02-23 15:07:52

标签: java sockets objectoutputstream

我正在尝试使用套接字开发手机和电脑之间的客户端 - 服务器连接。在开发过程中我遇到了一个问题并且无法修复它。问题出在输出流上。我使用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) {
        ....

我的节目冻结了。我需要这样做,因为我还需要做另一个命令,比如发送和接收文件。针对这个问题的任何解决方案?

3 个答案:

答案 0 :(得分:1)

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

// отправка пакета с файлами
            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;
            }
        }

向所有人寻求答案。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你不能这样做。关闭ObjectOutputStream将关闭套接字。您需要在套接字的生命周期内保持打开状态。无论如何,将它移到案件内是徒劳的。

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