Как получить данные из TCP-сокета в ByteBuffer

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

ServerSocket welcomeSocket = new ServerSocket(Integer.parseInt(ibmPort));
while (true) {
    Socket connectionSocket = welcomeSocket.accept();                   
    BufferedReader inFromClient =  new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
    clientSentence = inFromClient.readLine();
    System.out.println("Received: " + clientSentence);
    setRequestDataFromCT(clientSentence);
    capitalizedSentence = clientSentence.toUpperCase() + '\n';
    outToClient.writeBytes(capitalizedSentence);
}

person user1372020    schedule 18.09.2012    source источник
comment
Вы должны добавить, какой язык вы используете. Для меня это похоже на Java, но я не знаю.   -  person clentfort    schedule 18.09.2012
comment
Код, который вы разместили, использует интерфейс Reader, который обрабатывает удобочитаемые строки, а не байты. Это то, что вы хотите?   -  person pmoleri    schedule 18.09.2012
comment
Я хочу, чтобы он обрабатывал входящую строку как байт, поскольку там есть символы, которые нельзя преобразовать в строку.   -  person user1372020    schedule 18.09.2012


Ответы (3)


Этот код будет считывать все байты и сохранять их в ByteBuffer, возможно, вам придется настроить размер буфера для хранения всех необходимых данных.

int bufferSize = 8192;
ServerSocket welcomeSocket = new ServerSocket(Integer.parseInt(ibmPort));
while (true) {
    Socket connectionSocket = welcomeSocket.accept();
    ByteBuffer bf = ByteBuffer.allocate(bufferSize);
    BufferedInputStream inFromClient = new BufferedInputStream(connectionSocket.getInputStream());
    while (true) {
        int b = inFromClient.read();
        if (b == -1) {
            break;
        }
        bf.put( (byte) b);
    }
    connectionSocket.close();
}
person pmoleri    schedule 18.09.2012
comment
Большое спасибо. Я тоже буквально минуту назад нашел похожий способ. Выкладываю и здесь, может пригодится. - person user1372020; 18.09.2012

int count = SocketChannel.read(ByteBuffer). Не знаю, зачем вы добавили тег 'socketchannel', если не использовали SocketChannels, но вот как это сделать.

person user207421    schedule 18.09.2012

person    schedule
comment
Осторожно, нет гарантии, что метод чтения прочитает все данные сразу, он может вернуться с частью данных, которые нужно получить. - person pmoleri; 18.09.2012
comment
(-1, если бы мне разрешили) Вы не должны вызывать allocate() внутри цикла while - person Alastair; 16.11.2016