PrintWriter отправляет только часть строки Java - PullRequest
3 голосов
/ 13 февраля 2012

Я выполняю некоторые работы с сокетами в Java и пытаюсь кодировать данные, которые он отправляет.Эта часть работает правильно, но по какой-то причине не передает всю закодированную строку через сокет.Кажется, он отправляется частями 3.

Клиент выполняет простой readLine () из класса MyBufferedReader (который ниже), а сервер отправляет его так:

    private void sendFile(File f, String dest){ //The file to be sent and the destination
        System.out.println("Sending file started..");

        try {
            this.out.println("CMD MKFILE " + dest + "/" + f.getName());
            //TODO send the file
        }catch(Exception e){
            e.printStackTrace();
        }
    }

Клиент получает это: CMD MKFILE C:\Users\Lolmewn\Documents\test/dir/n/linebrea и после другого чтения k!.txt

Классы MyBufferedReader и MyPrintWriter выглядят так:

MyBufferedReader:

    @Override
    public String readLine() throws IOException {
        String read = super.readLine();
        System.out.println("UNDEC: " + read);
        try {
            System.out.println("DEC: " + decode(read));
            return decode(read);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return read;
    }

    public static String decode(String b) throws Exception {
        ByteArrayInputStream bais = new ByteArrayInputStream(b.getBytes("UTF-8"));
        InputStream b64is = MimeUtility.decode(bais, "base64");
        byte[] tmp = new byte[b.length()];
        int n = b64is.read(tmp);
        byte[] res = new byte[n];
        System.arraycopy(tmp, 0, res, 0, n);
        return new String(res);
     }

и MyPrintWriter:

    private String hash(String x) {
        try {
            return encode(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return x;
    }

    public static String encode(String b) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStream b64os = MimeUtility.encode(baos, "base64");
        b64os.write(b.getBytes("UTF-8"));
        b64os.close();
        return new String(baos.toByteArray());
     }

Что происходит и как я могу это исправить?

Обратите внимание: я выполняю асинхронную работу с этими сокетами, то есть не могу просто использовать некоторое время (читай!= ноль) заявление.Это может привести к тому, что другие данные, которые должны быть там, тоже не должны быть.

1 Ответ

1 голос
/ 13 февраля 2012

Прежде всего, если оставить в стороне: если вы отправляете сообщения из нескольких потоков / клиентов, вы должны открыть один сокет для каждого из них (как делает accept ()), чтобы сообщения от разных клиентов не могли чередовать друг друга.

Теперь я предполагаю, что только один клиент на сокет (разумно):

Я не могу просто использовать некоторое время (читай! = Ноль)

Вы должныреализовать простой протокол, с помощью которого вы можете отличить одно сообщение от следующего, например, использовать 0-байт, если это никогда не может быть частью данных, или префикс сообщения с длиной сообщения и отправлять оба;таким образом, ваш сервер может отличить одно сообщение от следующего.

...