Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из потоковых сокетов, Способы чтения байт из сокета 
:(
    Опции темы
pazlle
Дата 7.7.2012, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.7.2012

Репутация: нет
Всего: нет



Народ, возможно тема битая перебитая,но я прошу Вас помочь. Есть тестовый вариант "сниффера". я не могу разобраться как считать поток. Весь гугл опросил доки прочел..не работает. я новичок в java. Подскажите пожалуйста как можно прочесть байты из сокета? какое условие нужно поставить в цикле при обработке байт. цель взять поток клиента прочитать байты ввести в консоль и отправить на сервер,и наооборот. Заранее спасибо
Код

public  class testsniff {
    public static void main(String[] args) throws IOException {

    /*Подключение клиента*/
    int port = 6789;
    ServerSocket servock = null;
    try {
           servock = new ServerSocket(port);
           
         } catch (IOException e) {
           System.out.println("Couldn't listen to port 6789");
           System.exit(-1);
         }
         Socket fromclient = null;
         try {
           System.out.print("Waiting for a client...");
           
           fromclient= servock.accept();
           System.out.println("Client connected");
           System.out.print("Client connect to port:"+port+"\n");
         } catch (IOException e) {
           System.out.println("Can't accept");
           System.exit(-1);
         }
    /*Подключение к серверу*/
        String hostName = "localhost";
        int portserv = 6780;
         
         Socket sktForServer= null;
         try{
         sktForServer = new Socket(hostName, portserv);
         }
         catch(IOException e){
             System.out.print("Could'n connect to server");
         }
         
         System.out.print("Connect to server!port:"+portserv+"\n");
         /*Определение входногои выходного потоков клиента и Сервера*/
            
            InputStream inS= sktForServer.getInputStream();
            OutputStream outS = sktForServer.getOutputStream();
            InputStream inC = fromclient.getInputStream();
            OutputStream outC = fromclient.getOutputStream();
            /*Читаем исходящий поток клиента*/
            byte[] buffer = new byte[32768];
            // Выходной поток, ByteArrayOutputStream используется только для примера
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // цикл чтения
            while (true){
                // читаем данные в буфер
                int readBytesCount = inC.read(buffer);
                if (readBytesCount == -1) {
                    // данные закончились
                    break;
                }
                if (readBytesCount > 0) {
                    // данные были считаны - есть, что записать
                    baos.write(buffer, 0, readBytesCount);
                }
            }
            baos.flush();
            baos.close();
            byte[] data = baos.toByteArray();
        

    }
    

    
}



PM MAIL   Вверх
AntonSaburov
Дата 9.7.2012, 13:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 118



Вот пример сервера и клиента

Сервер:
Код

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;



/**
 * Класс - сервер, принимает запросы от клиентов и отдает данные
 */
public class BufferedThreadedSocketServer {

    public static void main(String args[]) throws Exception {
        // Определяем номер порта, который будет "слушать" сервер
        int cTosPortNumber = 1777;

        // Пишем, что стартовали сервер
        System.out.println("Client is started");

        // Открыть серверный сокет (ServerSocket)
        // Это специальный класс для сетевого взаимодействия с серверной стороны
        ServerSocket servSocket = new ServerSocket(cTosPortNumber);

        while(true) {
            System.out.println("Waiting for a connection on " + cTosPortNumber);
            // Получаем данные от клиента - они приходят к нам в виде обхекта класса Socket
            // accept - метод, который ожидает прихода запросов на порт
            Socket fromClientSocket = servSocket.accept();
            // Стартуем новй поток для клиента
            new SocketThread(fromClientSocket).start();
        }
    }
}
class SocketThread extends Thread {

    Socket fromClientSocket;

    public SocketThread(Socket fromClientSocket) {
        this.fromClientSocket = fromClientSocket;
    }

    @Override
    public void run() {
        // Создать поток для записи симовлов в сокет
        PrintWriter pw = null;
        try {
            String str;
            pw = new PrintWriter(fromClientSocket.getOutputStream(), true);
            // Создать поток для чтения символов из сокета
            // Для этого надо открыть поток сокета - socket1.getInputStream()
            // Потом перобразовать его в поток символов - new InputStreamReader
            // И уже потом сделать его читателем строк - BufferedReader
            BufferedReader br = new BufferedReader(new InputStreamReader(fromClientSocket.getInputStream()));
            // Читаем сообщения от клиента до тех пор пока он не скажет "bye" или окончит связь
            while ((str = br.readLine()) != null) {
                // Печатаем сообщение
                System.out.println("The message: " + str);
                // Сравниваем с "bye" и если что - выходим из цикла
                if (str.equals("bye")) {
                    // Тоже говорим клиенту "bye"
                    pw.println("bye");
                    // Выходим из цикла
                    break;
                } else {
                    str = "Server returns " + str;
                    pw.println(str);
                }
            }
            pw.close();
            br.close();
            fromClientSocket.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            pw.close();
        }
    }
}


Клиент:
Код

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

/**
 * Класс - клиент для получения данных из сокета
 */
public class BufferedSocketClient {

    public static void main(String args[]) throws Exception {
        // Определяем номер порта, на котором нас ожидает сервер для ответа
        int portNumber = 1777;
        // Подготавливаем строку для запроса
        String str = "Тестовая строка для передачи";

        // Пишем, что стартовали клиент
        System.out.println("Client is started");

        // Открыть сокет (Socket) для обращения к локальному компьютеру (InetAddress.getLocalHost())
        // Это специальный класс для сетевого взаимодействия c клиентской стороны
        Socket socket1 = new Socket(InetAddress.getLocalHost(), portNumber);

        // Создать поток для чтения символов из сокета
        // Для этого надо открыть поток сокета - socket1.getInputStream()
        // Потом перобразовать его в поток символов - new InputStreamReader
        // И уже потом сделать его читателем строк - BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(socket1.getInputStream()));

        // Создать поток для записи симовлов в сокет
        PrintWriter pw = new PrintWriter(socket1.getOutputStream(), true);

        // Мечатаем строку в сокет
        pw.println(str);

        // Читаем, что нам ответили из сокета
        while ((str = br.readLine()) != null) {
            // Отправляем тестовую строку
            System.out.println(str);
            // И потом посылаем ему "bye" для окончания "разговора"
            pw.println("bye");

            if (str.equals("bye")) {
                break;
            }
        }

        br.close();
        pw.close();
        socket1.close();
    }
}

PM MAIL WWW ICQ   Вверх
pazlle
Дата 12.7.2012, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.7.2012

Репутация: нет
Всего: нет



AntonSaburov, спасибо за пример. А если  я хочу посчитать кол-во байт, нужно же использовать InputStream и OutputStrem классы с методом read(byte[] int). 

Это сообщение отредактировал(а) pazlle - 12.7.2012, 02:05
PM MAIL   Вверх
AntonSaburov
Дата 12.7.2012, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 118



Не проблема - открывай не Reader/Writer а Input/Output Stream. Можно модифицировать пример под такие варианты.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.