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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Socket: Зависание при получении строчки 
:(
    Опции темы
MegaBitz
  Дата 13.11.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приложение зависает когда я пытаюсь получить строчку спомощью get_text(). Может что я ниправильно делаю, или нада по другому получать строчки из сокета? 

Вот код:
Код


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.SocketConnection;

public class Socket implements Runnable {

    private Main main;

    private SocketConnection sc;
    private InputStream input;
    private OutputStream output;
    private StringBuffer sb;
    public int status;

    public void run() {
        try {
            sc = (SocketConnection) Connector.open("socket://server.ru:6666",Connector.READ_WRITE,true);
            
            Main.mform.append("Connected\n");
            Main.mform.removeCommand(Main.connect);
            Main.mform.addCommand(Main.disconnect);
            Main.mform.addCommand(Main.consol_command);
            Main.mform.addCommand(Main.cmd_auth);

            input = sc.openInputStream();
            output = sc.openOutputStream();

            while(true){
                sb = new StringBuffer();
                int c = 0;

                while (((c = input.read()) != '\n') && (c != -1)) {
                    if((c>=192)&&(c<=255))
                        c=c+848;
                    sb.append((char)c);
                }

                if (c == -1) {
                    break;
                }

                
                Main.mform.append(sb.toString()+"\n");
                if(sb.toString().equals("PING \r")){
                     output.write("PONG".getBytes());
                     output.write("\r\n".getBytes());
                     Main.mform.append("PONG\n");
                }
                
                

            }

            Main.mform.append("Отключились!\n");
            disconnect();
        } catch (IOException ex) {
            if(status != 1){
                Main.mform.append("Ошибка при подключении: "+ex);
            }else{
               Main.mform.append("Отключились!\n");
            }
        }
    }

    public String get_text(String cmd){
                                                 //----- Отправляем команду
            try {
                output.write(cmd.getBytes());
                output.write("\r\n".getBytes());
                output.flush();
            } catch (IOException ioe) {
                Main.mform.append("Ошибка при отправки комманды");
            }

           StringBuffer buff = new StringBuffer();

                                              //------ Получаем ответ и заносим его в буффер
            while(buff.toString().equals("")||buff == null){
                int c = 0;

            try {
                while (((c = input.read()) != '\n') && (c != -1)) {
                    if ((c >= 192) && (c <= 255)) {
                        c = c + 848;
                    }
                    buff.append((char) c);
                }
            } catch (IOException ex) {
                System.out.println("Ошибка при получении данных");
            }

                if (c == -1) {
                    break;
                }
            }


            return buff.toString();
    }

    public void disconnect(){
        status = 1;
        try {
            output.close();
            input.close();
            sc.close();
        } catch (IOException ex) {
            Main.mform.append("Ошибка при отключении!");
        }
            Main.mform.removeCommand(Main.disconnect);
            Main.mform.removeCommand(Main.consol_command);
            Main.mform.removeCommand(Main.cmd_auth);
            Main.mform.addCommand(Main.connect);
    }


    public void start(){
        Thread t = new Thread(this);
        t.start();
    }

}


Помогите пожалуйста.
PM MAIL   Вверх
eugine_s
Дата 13.11.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Цитата(MegaBitz @  13.11.2009,  15:37 Найти цитируемый пост)
Приложение зависает когда я пытаюсь получить строчку спомощью get_text(). Может что я ниправильно делаю, или нада по другому получать строчки из сокета? 


Не заметил, где ты эту строчку вызываешь?
Наверное, в каком-то классе - запускаешь поток (метод start()), который открывает соединение, а дальше вызываешь get_text(). Только вопрос - а как должен себя вести get_text() если метод run, открыв соединение, получив in/out потоки вызывает disconnect()?
PM MAIL   Вверх
MegaBitz
Дата 13.11.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(eugine_s @ 13.11.2009,  19:20)
Цитата(MegaBitz @  13.11.2009,  15:37 Найти цитируемый пост)
Приложение зависает когда я пытаюсь получить строчку спомощью get_text(). Может что я ниправильно делаю, или нада по другому получать строчки из сокета? 


Не заметил, где ты эту строчку вызываешь?
Наверное, в каком-то классе - запускаешь поток (метод start()), который открывает соединение, а дальше вызываешь get_text(). Только вопрос - а как должен себя вести get_text() если метод run, открыв соединение, получив in/out потоки вызывает disconnect()?

Строчку я вызываю в главном классе, после того как поток уже запущен, вот так:
\
Код

private Socket soc = new Socket();
String res = soc.get_text("commanda");


Я запускаю методом start() поток, а если соединение разорвано или прекращается то вызывается метод disconnect(). Я прост j2me ток учу, строго не судите

Это сообщение отредактировал(а) MegaBitz - 13.11.2009, 21:19
PM MAIL   Вверх
MegaBitz
  Дата 14.11.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если код не возможно разобрать то напишите метод который будет посылать комманду и возвращать ответ в виде String
PM MAIL   Вверх
hamsterKSU
Дата 15.11.2009, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

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



ага - синхронный вызов....
надо делать вызовы асинхронными....

ты конечно молодец - у теья есть метод run который работает в другом потокке

а вот твой метод  - выполняться будет в том потоке откуда будет вызван - я так понимаю в UI
Код

 public String get_text(String cmd)


метод input.read() - блокирует поток и ждет байтики smile

есть несколько решений:
1. в методе get_text просто послеть команду на сервер, а ответ ждать в методе run
надо в этото твой класс передать слушатель(listener). в методе run, когда что-то прочитаешь -  говорить слушателю что вот это прочитал.

2. сделать общение с сервером на командах:
у тебя есть очередь команд которую надо выполнять. 
команда это класс который знает как ее выполнить и какие данные ждать в ответ и кого оповестить об этих данных.
Код

class NetComand{

 void writeRequest(OutoutStream out){
out.writeInt(CMD_CODE);
 }

 void handleResponse(InputStream is){
is.readUTF();
 }

}


3. если надо принимать данные от сервера не посылая на него команды. 
вешаем 2 потока - один занимаеться записью данных в сокет. другой читает от туда данные(не забываем о синхронизации).
но в этом методе надо точно знать, что за дынные пришли (т.е. формат пакета)
у меня наприме было следуещее - первым ишло всегда номер команды которую нам проталкивают.
далее по номеру команды я на клиенте ориентировался, что мне надо читать и в какой последовательности. 
т.ее как расшыфровать тот поток байтиков
наприме надо прочитать два инта и строку.
in.readint();
in.readInt();
in.readUTF();

вот и все - выбирай.

Это сообщение отредактировал(а) hamsterKSU - 15.11.2009, 01:46
PM MAIL ICQ   Вверх
MegaBitz
Дата 15.11.2009, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

1. в методе get_text просто послеть команду на сервер, а ответ ждать в методе run
надо в этото твой класс передать слушатель(listener). в методе run, когда что-то прочитаешь -  говорить слушателю что вот это прочитал.

А можно поподробней, прост я пока новичек
PM MAIL   Вверх
hamsterKSU
Дата 15.11.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

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



в твоем варианте - 

Код

 public void sendRequestForText(String cmd){
            //----- Отправляем команду
            try {
                output.write(cmd.getBytes());
                output.write("\r\n".getBytes());
                output.flush();
            } catch (IOException ioe) {
                Main.mform.append("Ошибка при отправки комманды");
            }


а в метоже run ждешь ответ:
строчка:
Код

 Main.mform.append(sb.toString()+"\n");


собственно похожа на то что тебе надо. listener - это объект которому ты скажешь что прочитал строку.

Код

interface NetListener{

public void getTextCompleted(String str);

}


вообшем твой класс реализует этот интерфейс. эту реализацию интерфейса передаешь в твой - класс Socket. а потом вызываешь нужные методы
PM MAIL ICQ   Вверх
MegaBitz
Дата 15.11.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



hamsterKSU, Спасибо, буду разбираться
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

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


 




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


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

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