簡體   English   中英

讀取InputStream字節

[英]Reading the InputStream bytes

我正在嘗試獲取clientSocketinputStream的字節。 代碼是用C ++編寫的,而我正嘗試用Java編寫。

我通過在Java中調用getBytes()方法來獲取ClientSocket::receive的字節數。 這與在ClientSocket::receive()方法中執行的操作是否相同? Java是否包含C ++中的recv類的方法?

C ++代碼:

//! Main function containing an endless loop which accepts and handels connections.
int _tmain(int argc, _TCHAR* argv[])
{
    while (true) {
        try {
            ServerSocket serverSocket;
            ClientSocket clientSocket(serverSocket.acceptConnection());
            try {
                SmartCard smartCard;
                handleConnection(clientSocket, smartCard);
            } catch (SmartCardException &e) {
                printf("SC Error: %s\n", e.what());
                SC_TCPPACKET answerMessage;
                answerMessage.type = e.getErrorCode();
                answerMessage.dLen = 0;
                clientSocket.send((char*)&answerMessage, answerMessage.dLen + MESSAGE_HEADER_LENGTH);
                throw e;
            }
        } catch (std::runtime_error &e) {
            printf("Error occured, resetting active connection.\nError message: %s\n", e.what());
        }
    }
    return 0;
}


//! Reads incoming stream and forwards complete pakets to the message handler defined above.
void handleConnection(ClientSocket &clientSocket, SmartCard &smartCard)
{
    BYTE receiveBuffer[RECEIVE_BUFFER_LENGTH];
    SC_TCPPACKET receivedMessage;
    DWORD bufferOffset = 0; // Number of unprocessed bytes overall
    int receivedBytes;      // Number of received bytes in current iteration
    do {
        receivedBytes = clientSocket.receive(((char*)receiveBuffer)+bufferOffset, RECEIVE_BUFFER_LENGTH-bufferOffset);
        bufferOffset += receivedBytes;
        while (bufferOffset >= MESSAGE_HEADER_LENGTH) { // header information with length available
            memcpy(&receivedMessage, receiveBuffer, MESSAGE_HEADER_LENGTH);
            if (receivedMessage.dLen > MESSAGE_MAXIMUM_LENGTH)
                throw std::runtime_error("Possible overflow attack, closing socket!");
            if (receivedMessage.dLen <= bufferOffset - MESSAGE_HEADER_LENGTH) { // paket complete
                // copy out whole package data
                memcpy(&receivedMessage, receiveBuffer, MESSAGE_HEADER_LENGTH + receivedMessage.dLen);
                // setting offset for remaining data in buffer
                bufferOffset -= MESSAGE_HEADER_LENGTH + receivedMessage.dLen;
                // move remaining data of buffer to front
                memmove(receiveBuffer, receiveBuffer + MESSAGE_HEADER_LENGTH + receivedMessage.dLen, bufferOffset);
                handleMessage(receivedMessage, clientSocket, smartCard);
            } else {
                break; // no further pakets to process, back to reading more data
            }
        }
    } while (receivedBytes > 0);
}


int ClientSocket::receive(char * buffer, int len, int flags)
{
    int ret = recv(socket, buffer, len, flags);
    if (ret == SOCKET_ERROR)
        throw ClientSocketException();

    printf("CS RX(%3d): ", ret);
    for (int b = 0; b < ret; ++b)
        printf("%02x ", (BYTE) (buffer[b]));
    printf("\n");

    return ret;
}

Java代碼

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Test {

    public static void main(String args[]) throws Exception {
        InputStream inputStream = null;
        ServerSocket serverSocket = new ServerSocket(27015);
        while (true) {
            Socket clientSocket = serverSocket.accept();
            inputStream = clientSocket.getInputStream();
            int byteData = Test.getBytes(inputStream, 512);
            System.out.println("Test");

        }
    }

    public static int getBytes(InputStream is, int size) throws IOException {
        int len;
        byte[] buf;

        if (is instanceof ByteArrayInputStream) {
            size = is.available();
            buf = new byte[size];
            len = is.read(buf, 0, size);
        } else {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            buf = new byte[size];
            while ((len = is.read(buf, 0, size)) != -1) {
                bos.write(buf, 0, len);
            }
            buf = bos.toByteArray();
        }
        return buf.length;
    }

}

Java是否包含C ++中的recv類的方法?

是的,您已經在打電話了。

這是int read(byte[] b, int off, int len)方法,該方法從流/套接字讀取給定長度的給定緩沖區,並返回讀取的實際字節數。

就像ssize_t recv(int sockfd, void *buf, size_t len, int flags)一樣。


至於您的getBytes()方法。

該方法的目的是什么,它消耗流中的字節並丟棄它們

C代碼中沒有什么比該方法正在執行的更接近。

擺脫它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM