当我从套接字收到一些数据时为什么会附加大量空格?

时间:2013-03-14 11:50:14

标签: java sockets serversocket

您好我正在编写一个简单的java程序来从套接字读取数据,但遇到了一个问题,在每次输入后我都会有很多空格。

AIM:编写一个简单的服务器套接字,可以从客户端套接字读取CORRECT数据。

到目前为止:我已经能够编写从socket读取的代码,甚至能够读取数据,但事情是我最后得到了很多空格。

所以我不得不使用trim()来管理空间,但我仍然不知道这是对还是错。

对此表示赞赏。

注意:我使用windows7 telnet服务连接到socket。

readSocket() {
    System.out.println(client_socket);
    try {
        System.out.println("reading socket");
        /*BufferedReader brIn = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
        String inputLine = null;
        while ((inputLine = brIn.readLine()) != null) {
            System.out.println(inputLine);
        }*/
        InputStream is = client_socket.getInputStream();
        byte[] byteArr = new byte[1024];
        int inputsize = -1;
        int currentPos = 0;
        StringBuffer sb = new StringBuffer(11111);
        /*while((inputsize = is.read(byteArr)) != -1) {
            String processed = new String(byteArr);
            sb.append(processed);
        }*/
        int BUFFER_SIZE = 1024;
        int read;
        byte[] buffer = new byte[BUFFER_SIZE];
        String processed = "";
        while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {
            String current = new String(byteArr);
            //os.write(buffer, 0, read);
            System.out.println("current Process   "+current);

            //processed +=current;
            sb.append(current.toString().trim());
        }
        System.out.println("Socket input is : "+sb.toString());
        System.out.println("Sending response to client  "+processed.toString());
        //client_socket.getOutputStream().write(sb.toString().getBytes());
        //client_socket.getOutputStream().close();

        FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\himanshu2100\\eee.txt"));
        fos.write(processed.getBytes());
        fos.close();
        is.close();
        client_socket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

使用RogerLindsjö和mprivat的建议,我重新设计了我从流中读取的部分。

readSocket() {
    System.out.println(client_socket);
    try {
        System.out.println("reading socket");
        InputStream is = client_socket.getInputStream();
        byte[] byteArr = new byte[1024];

        int read;
        int BUFFER_SIZE = 1024;

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {
            baos.write(byteArr, 0, read);   //This is an optimized design, instead of having so many strings
        }
        System.out.println("Output is :"+new String(baos.toByteArray()));
        baos.close();
        is.close();
        client_socket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我希望这个是更好的解决方案,所以发布它。建议欢迎。

2 个答案:

答案 0 :(得分:5)

在这一行:while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {

read将包含实际读取的字节数,因此如果您的服务器发送字符串“CORRECT”但您的BUFFER_SIZE为1024,那么您将拥有大量额外空间,因此您无法做到这个:String current = new String(byteArr);。相反,您必须只使用从流中读取的字节:

String current = new String(byteArr, 0, read);

答案 1 :(得分:1)

当您读入数组时,可能无法填充整个数组。 read 变量将包含读取的实际字节数。

    while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {
        String current = new String(byteArr, 0, read);
        System.out.println("current Process   "+current);
        sb.append(current);
    }

如果您使用多字节编码,则上述可能不起作用,因为该字符的每个部分可能位于单独的读取中,这会产生无效的序列。