문제

나는 소켓과 함께 Java로 프로그램을 만들고 있습니다. 클라이언트와 클라이언트에서 서버로 명령을 보낼 수 있습니다. 명령을 읽으려면 a를 사용합니다 BufferedReader. 그것들을 쓰려면, a PrintWriter 하지만 이제 파일을 전송하고 싶습니다 저것 소켓 (단순히 두 번째 연결을 만드는 것이 아닙니다).
먼저 파일에 포함 된 바이트 수에 outputStream에 씁니다. 예를 들어 40000 바이트. 그래서 나는 숫자를 씁니다 40000 소켓을 통해, 그러나 연결의 다른 쪽은 읽습니다. 78.

그래서 나는 생각했다 : BufferedReader 단순한 라인 이상을 읽습니다 (전화로 readLine()) 그리고 그런 식으로 나는 파일 데이터에서 바이트를 잃습니다. 그들이 버퍼에 있기 때문입니다 BufferedReader.
그래서 숫자 78 전송하려는 파일의 바이트입니다.

이런 식으로 생각하는 방식입니다. 그렇다면이 문제를 해결하는 방법.
잘 설명했으면 좋겠어요.


여기 내 코드가 있지만 내 기본 언어는 네덜란드입니다. 따라서 일부 가변적 인 이름은 스탠드 소리를 낼 수 있습니다.

public void flushStreamToStream(InputStream is, OutputStream os, boolean closeIn, boolean closeOut) throws IOException {
    byte[] buffer = new byte[BUFFERSIZE];
    int bytesRead;
    if ((!closeOut) && closeIn) { // To Socket from File
        action = "Upload";
        os.write(is.available()); // Here I write 400000
        max = is.available();
        System.out.println("Bytes to send: " + max);
        while ((bytesRead = is.read(buffer)) != -1) {
            startTiming(); // Two lines to compute the speed
            os.write(buffer, 0, bytesRead);
            stopTiming(); // Speed compution
            process += bytesRead;
        }
        os.flush();
        is.close();
        return;
    }
    if ((!closeIn) && closeOut) { // To File from Socket
        action = "Download";
        int bytesToRead = -1;
        bytesToRead = is.read(); // Here he reads 78.
        System.out.println("Bytes to read: " + bytesToRead);
        max = bytesToRead;
        int nextBufferSize;
        while ((nextBufferSize = Math.min(BUFFERSIZE, bytesToRead)) > 0) {
            startTiming();
            bytesRead = is.read(buffer, 0, nextBufferSize);
            bytesToRead -= bytesRead;
            process += nextBufferSize;
            os.write(buffer, 0, bytesRead);
            stopTiming();
        }
        os.flush();
        os.close();
        return;
    }
    throw new IllegalArgumentException("The only two boolean combinations are: closeOut == false && closeIn == true AND closeOut == true && closeIn == false");
}

다음은 해결책입니다.
제임스 제안 덕분에
제 생각에는 Laginimaineb Anwser는 솔루션의 일부였습니다.

명령을 읽으십시오.

DataInputStream in = new DataInputStream(is); // Originally a BufferedReader
// Read the request line
String str;
while ((str = in.readLine()) != null) {
    if (str.trim().equals("")) {
       continue;
    }
    handleSocketInput(str);
}

이제 FlushstreamToStream :

public void flushStreamToStream(InputStream is, OutputStream os, boolean closeIn, boolean closeOut) throws IOException {
    byte[] buffer = new byte[BUFFERSIZE];
    int bytesRead;
    if ((!closeOut) && closeIn) { // To Socket from File
        action = "Upload";
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeInt(is.available());

        max = is.available();
        System.out.println("Bytes to send: " + max);
        while ((bytesRead = is.read(buffer)) != -1) {
            startTiming();
            dos.write(buffer, 0, bytesRead);
            stopTiming();
            process += bytesRead;
        }
        os.flush();
        is.close();
        return;
    }
    if ((!closeIn) && closeOut) { // To File from Socket
        action = "Download";
        DataInputStream dis = new DataInputStream(is);
        int bytesToRead = dis.readInt();
        System.out.println("Bytes to read: " + bytesToRead);
        max = bytesToRead;
        int nextBufferSize;
        while ((nextBufferSize = Math.min(BUFFERSIZE, bytesToRead)) > 0) {
            startTiming();
            bytesRead = is.read(buffer, 0, nextBufferSize);
            bytesToRead -= bytesRead;
            process += nextBufferSize;
            os.write(buffer, 0, bytesRead);
            stopTiming();
        }
        os.flush();
        os.close();
        return;
    }
    throw new IllegalArgumentException("The only two boolean combinations are: closeOut == false && closeIn == true AND closeOut == true && closeIn == false");
}

마티 -.

도움이 되었습니까?

해결책

DatainputStream은 사용하려는 것입니다. 또한 사용 가능한 () 메소드는 일반적으로 쓸모가 없으므로 사용하지 마십시오.

다른 팁

나는 당신의 설명을 따랐는지 확실하지 않습니다.

그러나 예 - 버퍼드 리더가 실제로 얼마나 읽을 것인지에 대한 진정한 제어가 없습니다. 그러한 독자의 요점은 버퍼를 보충하는 데 필요한 기초 자원의 덩어리를 낙관적으로 읽는 것입니다. 그래서 처음 전화 할 때 readLine, 내부 버퍼는 요청에 서비스를 제공하기에 충분하지 않으며 꺼져서 버퍼에 느끼는 많은 바이트를 읽으십시오. 기본 소스에서 일반적으로 당신이 요청한 것보다 훨씬 더 많습니다. 버퍼가 채워지면 버퍼링 된 컨텐츠에서 라인을 반환합니다.

따라서 버퍼링 리더에서 입력 스트림을 감싸면 동일한 버퍼 리더를 통해 해당 스트림 만 읽어야합니다. 당신이하지 않으면 데이터를 잃게 될 것입니다 (일부 바이트가 소비되었고 이제는 완충식 리더의 캐시에 앉아 있습니다).

버퍼링 리더는 그것이 기본 입력 스트림에서 유일하게 독서라고 가정합니다.

그것은 기본 스트림에서 읽기 수를 최소화하는 것이 목적입니다 (매우 깊이 위임 할 수 있으므로 비싸다). 이를 위해 버퍼를 유지하고 읽기에 의해 채워집니다. 가능한 많은 바이트 기본 스트림에 대한 단일 호출로 그것에.

그렇습니다. 진단이 정확합니다.

여기에 야생 찌르기 -40000은 이진의 1001110001000000입니다. 이제, 처음 7 개의 비트는 1001110입니다. 이는 2 바이트의 정보를 쓰고 있지만 7 비트를 읽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top