Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Чтение из потоковых сокетов


Автор: pazlle 7.7.2012, 01:08
Народ, возможно тема битая перебитая,но я прошу Вас помочь. Есть тестовый вариант "сниффера". я не могу разобраться как считать поток. Весь гугл опросил доки прочел..не работает. я новичок в 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();
        

    }
    

    
}



Автор: AntonSaburov 9.7.2012, 13:33
Вот пример сервера и клиента

Сервер:
Код

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();
    }
}

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

Автор: AntonSaburov 12.7.2012, 11:23
Не проблема - открывай не Reader/Writer а Input/Output Stream. Можно модифицировать пример под такие варианты.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)