Как мне поточить с сокетами, чтобы программа не остановилась - PullRequest
2 голосов
/ 22 июля 2011

Кажется, что когда я использую метод accept из класса Socket, вся программа зависает, пока не поступят данные. Я передал сокет потоку, и он не зависает, но мне нужен поток, чтобы вернуть данные обратно, что я не думаю, что это может сделать.

Код для получения имени пользователя

public boolean checkUsername() {
    NetworkIO n = new NetworkIO();
    // Grabs username from edittext field
    username = usernameEditText.getText().toString();
    System.out.println(usernameEditText.getText().toString());
    // queries databse for username
    try {
        resultFromServer = n.query("username",
                "select username FROM user_info  WHERE MATCH (username)  AGAINST ('"
                        + username + "' IN NATURAL LANGUAGE MODE);");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Код для класса NetworkIO

public class NetworkIO extends Activity {
    Socket networkSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;


public String query(String request, String fieldRequested)
        throws IOException {

    // Tries to get connection
    try {

        networkSocket = new Socket("192.168.1.8", 9009);

        out = new PrintWriter(networkSocket.getOutputStream(), true);

        in = new BufferedReader(new InputStreamReader(
                networkSocket.getInputStream()));
        System.out.println("Hi from in made");
    } catch (UnknownHostException e) {
        System.err.println("Unknown host");
        System.exit(-1);

    } catch (IOException e) {
        System.err.println("IOException");
        System.exit(-1);
    }


    //Sends Request
    out.println(request);
    out.println(fieldRequested);
    String resultFromServer = "";

    //Waits for response and if its null exit
    while ((in.readLine()) != null) {
        resultFromServer += in.readLine();

    }
    System.out.println(resultFromServer);

    //Close the connections
    out.close();
    in.close();
    networkSocket.close();


    return resultFromServer;
}
}

Любая критика моего кода будет высоко оценена:)

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

Обычный шаблон - запустить цикл приема внутри потока и иметь отдельный пул обработчиков потоков, к которому вы отправляете запросы.

Когда вы получаете новый сокет от accept, передайте сокетрабочий поток для обработки.Таким образом, вам больше не нужно ничего передавать обратно в основной поток.

Пример прямо из javadocs ExecutorService: http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

1 голос
/ 22 июля 2011

Интересно, что вы используете сокеты и потоки.Есть ли причина, по которой вы не используете трубы? Производительность сокетов по сравнению с каналами : Каналы имеют гораздо лучшую производительность, когда вы просто используете потоки.

Теперь, если вам действительно нужны сокеты, вот несколько примеров кода, которые могут помочь проиллюстрировать общее представление овся организация сокетов клиент-сервер:

http://zerioh.tripod.com/ressources/sockets.html

0 голосов
/ 22 июля 2011

Кажется, что когда я использую метод accept из класса Socket, вся программа зависает до тех пор, пока не поступят данные.

  1. В методе accept () нетКласс сокета.
  2. В классе ServerSocket есть один.
  3. Это блокирует до тех пор, пока не будет установлено соединение .
  4. Этовозвращает Socket.
  5. Чтение блоков Socket до тех пор, пока не поступят данные.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...