Java-приложение - PullRequest
       3

Java-приложение

0 голосов
/ 19 мая 2011

Для Java-приложения: почему нет возможности запустить два разных потока в одном и том же главном ???

Один поток, который прослушивает входящие соединения с портом, и другой поток, который слушает другиесоединения с совершенно другим портом ???

Что-то вроде:

public static void main(String[] args) {

        // TODO Auto-generated method stub


         ClientThread clienThread= new ClientThread();
        new Thread(clienThread).start();

        ThreadPooledServer server = new ThreadPooledServer(6000);
        new Thread(server).start();
    }

Где ClientThread () и ThreadPooledServer () - это два разных потока!

Вопрос: Почему неява позволила мне это сделать?

public class Start {

    Socket socket;
    private String  serverIpAddress="127.0.0.1";
    static Thread cThread;
    public static void main(String[] args) {
        // TODO Auto-generated method stub


         ClientThread clienThread= new ClientThread();
        new Thread(clienThread).start();

        ThreadPooledServer server = new ThreadPooledServer(6000);
        new Thread(server).start();




    }


}

public class ClientThread implements Runnable {

        public void run() {
            try {
                InetAddress serverAddr = InetAddress.getByName(serverIpAddress);

                socket = new Socket(serverAddr, 6100);

                System.out.println("s-a creat");
            } catch (UnknownHostException e) {
                System.err.println("Don't know about host");
            } catch (IOException e) {
                System.err
                        .println("Couldn't get I/O for the connection to host");
            }


        }
    }

public class ThreadPooledServer implements Runnable {

    protected int serverPort =6000;
    public static String SERVERIP = "127.0.0.1";
    protected ServerSocket serverSocket = null;
    protected boolean isStopped = false;
    protected Thread runningThread = null;
    public static int clientconnection = 0;
    Vector<WorkerRunnable> workerList = null;

     protected ExecutorService threadPool =
            Executors.newFixedThreadPool(5);

    public ThreadPooledServer(int port) {
        this.serverPort = port;
        workerList = new Vector<WorkerRunnable>();
    }

    public void run() {
        synchronized (this) {
            this.runningThread = Thread.currentThread();
        }
        openServerSocket();

        while (!isStopped()) {
            Socket clientSocket = null;
            try {
                System.out.println("Serverul asteapta clienti spre conectare");
                clientSocket = this.serverSocket.accept();
                clientconnection++;
                System.out.println("Serverul a acceptat clientul cu numarul:"
                        + clientconnection);
                // Log.d("Server:","s-a acceptat un nou client");

            } catch (IOException e) {
                if (isStopped()) {
                    System.out.println("Server Stopped.");
                    return;
                }
                throw new RuntimeException("Error accepting client connection",
                        e);
            }
            // creare thread pt noul client conectat
            //WorkerRunnable workerRunnable = new WorkerRunnable(clientSocket);
            //Thread workerThread = this.threadPool.execute(new WorkerRunnable(clientSocket));
            //workerThread.start();
            this.threadPool.execute(new WorkerRunnable(clientSocket));
            //this.workerList.add(workerRunnable);
        }
        this.threadPool.shutdown();
        System.out.println("Server Stopped.");
    }

    private synchronized boolean isStopped() {
        return this.isStopped;
    }

    public synchronized void stop() {
        this.isStopped = true;
        try {
            this.serverSocket.close();
            // stop thread-uri workers
            for (int i = 0; i < this.workerList.size(); i++) {
                WorkerRunnable worker = this.workerList.elementAt(i);
                worker.stop();
            }
        } catch (IOException e) {
            throw new RuntimeException("Error closing server", e);
        }
    }

    private void openServerSocket() {
        try {
            InetSocketAddress serverAddr = new InetSocketAddress(SERVERIP,
                    serverPort);
            serverSocket = new ServerSocket();
            serverSocket.bind(serverAddr);

        } catch (IOException e) {
            throw new RuntimeException("Cannot open port 6000", e);
        }
    }
}

public class WorkerRunnable implements Runnable {

    protected Socket clientSocket = null;
    Scanner s = null;
    String longitude;
    String latitude;

    boolean stop = false;

    public WorkerRunnable(Socket clientSocket) {
        this.clientSocket = clientSocket;

    }

    public void run() {

        try {

            System.out.println("O noua conexiune acceptata"
                    + clientSocket.getInetAddress() + "cu portul"
                    + clientSocket.getPort());

            Scanner is = new Scanner(new DataInputStream(
                    this.clientSocket.getInputStream()));
            while (!stop) {

                while (is.hasNext()) {
                    try {
                        longitude = is.next();
                        latitude = is.next();
        System.out.println(longitude);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }

            is.close();
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void stop() {
        this.stop = true;
    }

Это все, что у меня есть !!!

РЕДАКТИРОВАТЬ: я переместил код ClientThread в другой класс, и мне удалось запустить мой код, но теперь я не могу создать два сокета.

Я имею в виду, что он создает один, но для второго яget:

"Не удалось получить ввод-вывод для подключения к хосту"

Я предполагаю, что это происходит отсюда:

 catch (IOException e) {

                System.err
                        .println("Couldn't get I/O for the 
connection to host");

        }

Кто-то знает, почему?

Ответы [ 4 ]

4 голосов
/ 19 мая 2011

Это не имеет ничего общего с потоками или сокетами.Ошибка, которую вы получаете, описана здесь .Не видя ваш код, я бы сказал, что классы, которые вы пытаетесь создать, являются внутренними классами Start.У вас нет экземпляра Start, потому что вы используете статический метод main ().

попробуйте что-то вроде:

public class Start
{
  public static void main(String[] args)
  {
    Start myStart = new Start();
    myStart.doIt();
  }

  private void doIt()
  {
    ClientThread clienThread= new ClientThread();
    new Thread(clienThread).start();

    ThreadPooledServer server = new ThreadPooledServer(6000);
    new Thread(server).start();
  }
}
1 голос
/ 19 мая 2011

Относительно «Нет доступного экземпляра типа Start.»:

Либо создайте шаги в конструкторе и создайте новый объект вашего класса, либо объявите статический внутренний класс (если ему не нужен доступ к членам внешних классов)

1 голос
/ 19 мая 2011

Абсолютно возможно запустить столько потоков из main (), сколько вы пожелаете (ОС может накладывать некоторые ограничения).

К сожалению, мой хрустальный шар ремонтируется, поэтому я могу только догадываться, что может работать неправильно: - другой процесс связан с портом 6000 (может быть, старый экземпляр вашей Java-программы?) - некоторая синхронизация в тупиках потоковони - что-то еще; -)

Может быть, вы можете прояснить вашу проблему?

0 голосов
/ 19 мая 2011

На основании отзыва в комментарии: «Нет доступного экземпляра типа Start. Необходимо квалифицировать распределение с включающим экземпляром типа Start (например, xnew A (), где x - это экземпляр Start». Похоже, что классНачало оказывается внутренним классом некоторого класса X. Инициализация экземпляра внутреннего класса не так тривиальна, как для «обычного класса». Нельзя инициализировать внутренний класс, используя следующую запись:

Outer.Inner obj = new Outer.Inner();

Вместо этого должны использоваться следующие обозначения:

Outer.Inner obj = outerObj.new Inner();

, где Outer является классом включения, Inner является вложенным классом, а outerObj является экземпляром класса включения.

PS: Пожалуйста, включите дополнительную информацию в свои вопросы, чтобы кто-нибудь мог определить проблему. Ваш первоначальный вопрос не содержит никакой информации, которая поможет вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...