PrintWriter只发送部分字符串Java

时间:2012-02-13 12:36:51

标签: java sockets printwriter println

我正在使用Java进行一些套接字工作,并且正在尝试对正在发送的数据进行编码。 该部分工作正常,但由于某种原因,它不会通过套接字发送整个编码的字符串。它似乎发送它的部分3。

客户端从MyBufferedReader类(下面)执行一个简单的readLine(),服务器发送它如下:

    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());
     }

发生了什么,我该如何解决这个问题?

请注意:我正在对这些套接字进行异步工作,这意味着我不能只使用while(read!= null)语句。这将导致其他数据不应该存在。

1 个答案:

答案 0 :(得分:1)

首先,如果您要从多个线程/客户端发送,那么您应该为每个线程/客户端打开一个套接字(例如accept()),这样来自不同客户端的消息就不会相互交错。

现在我假设每个插槽只有一个客户端(合理):

  

我不能只使用一段时间(读!= null)

您必须实施一个简单的协议,您可以使用该协议将一条消息与下一条消息区分开来,例如如果永远不能成为数据的一部分,则使用0字节,或者使用消息的长度为消息添加前缀并发送两者;这样你的服务器可以将一条消息与下一条消息区分开来。