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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты в J2ME, как постоянно прослушивать порт? 
:(
    Опции темы
alexdrob
Дата 20.2.2009, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!

Начал изучать Java и сталкнулся с такой проблеммой, хочу сделать мидлет который будет подключаться к другому с помощью сокетов и посылать и принемать данные.

как я понял что ессли для openInputStream() или openOutputStream() выполнить .close() то openInputStream() и openOutputStream() уничтожаются.

передаю данные так

Код

os = sc.openOutputStream();
os.write(data);
os.close();


а принимаю так

Код

is = sc.openInputStream();
StringBuffer sb = new StringBuffer();
int ch=0;
while ((ch=is.read())!=-1) {
      sb.append(ch);
}
is.close();


так проблемма в том что код после кода приёма не выполняеться пока не выполню os.close(); т.е. получаеться что после каждой отправки данных нужно опять создавать SocketConnection? или яне правильно что то делаю
PM MAIL   Вверх
eugine_s
Дата 20.2.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробуй
Код

os = sc.openOutputStream();
os.write(data);
os.flush();
os.close();

PM MAIL   Вверх
alexdrob
Дата 20.2.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(eugine_s @ 20.2.2009,  12:56)
попробуй
Код

os = sc.openOutputStream();
os.write(data);
os.flush();
os.close();

а что это изменит? проблемма в последней строке

Код

os.close();


после закрытия больше нельзя пользовотся 

Код

os = sc.openOutputStream();
os.write(data);


вот функция отправки

Код

public void send(byte[] data) throws IOException{
        os = sc.openOutputStream();
        os.write(data);
        os.close();
}


первый раз вызывается норм, а второй не вызываеться
PM MAIL   Вверх
alexdrob
Дата 20.2.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



выложу весь код проги, эту прогу делаю для изучения работы сокетов:

Main
Код

package hello;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Main extends MIDlet {
    
    Form form;
    NetServer server;
    NetClient client;
    private boolean SERVER =  false;//true;
    
    public void startApp() {
        form = new Form("Network");
        Display.getDisplay(this).setCurrent(form);
        if (SERVER){
            server = new NetServer();
            server.start();
        }else{
            client = new NetClient();
            client.start();
            client.send("Hello1!!!".getBytes());
            client.send("Hello2!!!".getBytes());
            client.send("Hello3!!!".getBytes());
        }
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}


NetServer
Код

package hello;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.io.*;

public class NetServer implements Runnable{
    
    private ServerSocketConnection server;
    private StreamConnection sc;
    private InputStream is;
    private OutputStream os;
    public boolean OPEN;
    
    public void NetServer(){
        OPEN = false;
    }
    
    public void start(){
        try {
            server = (ServerSocketConnection) Connector.open("socket://:9002");
            sc = server.acceptAndOpen();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        OPEN = true;
        Thread t = new Thread(this);
        t.start();
    }
    
    public void send(byte[] data) throws IOException{
        os = sc.openOutputStream();
        os.write(data);
        os.close();
    }
    
    public String read() throws IOException{
        is = sc.openInputStream();
        StringBuffer sb = new StringBuffer();
        int ch=0;
        while ((ch=is.read())!=-1) {
            sb.append((char)ch);
        }
        is.close();
        return sb.toString();
    }
    
    public void run(){
        while(OPEN == true){
            try {
                    System.out.println("---------------------- " + read());
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}


NetClient
Код

package hello;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.io.*;

public class NetClient implements Runnable{
    
    private SocketConnection client;
    private InputStream is;
    private OutputStream os;
    public boolean OPEN;
    
    public void NetClient(){
        OPEN = false;
    }

    public void start(){
        try {
            client = (SocketConnection) Connector.open("socket://localhost:9002");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        OPEN = true;
        Thread t = new Thread(this);
        t.start();
    }
    
    public void send(byte[] data){
        try {
            os = client.openOutputStream();
            os.write(data);
            os.flush();
            os.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    public String read() throws IOException{
        is = client.openInputStream();
        StringBuffer sb = new StringBuffer();
        int ch=0;
        while ((ch=is.read())!=-1) {
            sb.append(ch);
        }
        is.close();
        return sb.toString();
    }
    
    public void run(){
        while(OPEN == true){
            try {
                System.out.println("----------------------" + read());
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

PM MAIL   Вверх
alexdrob
Дата 20.2.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вообщем вроде разобрался с этим,  но появилась новая проблемма, на эмуле всё норм работает, а сотовый не можект выполнять роль сервера.
если комп запустить первым то он в роли сервера, потом запустить сотовый и он конектится и всё работает. если сотовый запустить первым, то он доходит до строки

Код

server = (ServerSocketConnection) Connector.open("socket://:3128");

и на этом виснет. пробовал на самсунге i710 и на SE c702

работать должно так:
прога конектится к http://stone-decor.ru/xNetBat.php и в ответ приходит OK а IP сервера сохраняеться на хостинге http://stone-decor.ru/xNetBat.php после этого когда конектится другая прога ей приходит IP сервера (первой проги)

код приложения ниже:

Main
Код

package hello;

import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Main extends MIDlet implements CommandListener{
    
    Form form;
    StringItem sItem;
    NetSocket socket;
    public String cIP;
   
    public void startApp() {
        form = new Form("Network");
        form.addCommand(new Command("EXIT", Command.EXIT, 0));
        form.addCommand(new Command("connect", Command.ITEM, 0));
        form.addCommand(new Command("send HELLO!", Command.ITEM, 0));
        form.addCommand(new Command("send HI!!!", Command.ITEM, 0));
        form.setCommandListener(this);
        sItem = new StringItem("Text:", "");
        form.append(sItem);
        socket = new NetSocket(this);
        setText("Text");
        Display.getDisplay(this).setCurrent(form);
    }
    
    public void setText(String str){
        sItem.setText(str);
    }
            
            
    public void getIP(){
        HttpConnection c = null;
        InputStream _is = null;
        StringBuffer sb = new StringBuffer();
        try {
            c = (HttpConnection)Connector.open(
                "http://stone-decor.ru/xNetBat.php", 
                Connector.READ_WRITE, true);
            c.setRequestMethod(HttpConnection.GET); 
            _is = c.openInputStream();
            int ch = 0;
            for(int ccnt=0; ccnt < 150; ccnt++) {
                ch = _is.read();
                if (ch == -1){
                    break;
                }
                sb.append((char)ch);
            }
        }
        catch (IOException x){
            x.printStackTrace();
        }
        finally{
            try {
                _is.close();
                c.close();
            } catch (IOException x){
                x.printStackTrace();
            }
        }
        cIP = sb.toString();
    }
    
    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        try {
            socket.stop();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void commandAction(Command c, Displayable arg1) {
        if(c.getLabel()=="connect"){
            Thread t = new Thread(){
                public void run(){
                  getIP();
                  socket.start(cIP); 
                }
            };
            t.start();        
        }
        if(c.getLabel()=="send HELLO!"){
            socket.send("Hello!".getBytes());
        }
        if(c.getLabel()=="send HI!!!"){
            socket.send("Hi!!!".getBytes());
        }
        if(c.getLabel()=="EXIT"){
            notifyDestroyed();
        }
    }
}


NetSocket
Код

package hello;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.io.*;

public class NetSocket extends Thread implements Runnable{
    
    private ServerSocketConnection server;
    private SocketConnection client;
    private StreamConnection sc;
    private InputStream is;
    private OutputStream os;
    public boolean OPEN;
    private Main main;

    NetSocket(Main aThis) {
        OPEN = false;
        main = aThis;
    }
    
    public void stop() throws IOException{
        OPEN = false;
    }
    
    public void start(String cIP){
        System.out.println(cIP);
        if (cIP.length() == 2){
            try {
                main.setText("YOU SERVER!");
                server = (ServerSocketConnection) Connector.open("socket://:3128");
                main.setText("WAIT CLIENT!");
                sc = server.acceptAndOpen();
                main.setText("CLIENT CONNECT!");
                is = sc.openInputStream();
                os = sc.openOutputStream();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }else{
             try {
                main.setText("YOU CLIENT!");
                client = (SocketConnection) Connector.open("socket://"+cIP+":3128");
                is = client.openInputStream();
                os = client.openOutputStream();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        OPEN = true;
        Thread t = new Thread(this);
        t.start();
    }

    
    public void send(byte[] data){
        try {
            os.write(data);
            os.flush();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    public String read(){
        StringBuffer sb = new StringBuffer();
        int ch=0;
        try{
            while(is.available()>0){
                ch=is.read();
                sb.append((char)ch);
            }
        }finally{
            return sb.toString();
        }
    }
    
    public void run(){
        while(OPEN == true){
            String st = read();
            if (st.length() > 0){
                main.setText(st);
            }
        }
    }

}


Это сообщение отредактировал(а) alexdrob - 20.2.2009, 17:41
PM MAIL   Вверх
W0LF
Дата 21.2.2009, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



надо просто javadoc внимательно читать
есть такой метод - acceptAndOpen()
пример


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
alexdrob
Дата 21.2.2009, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я использую этот метод

Код

main.setText("YOU SERVER!");
server = (ServerSocketConnection) Connector.open("socket://:3128");
main.setText("WAIT CLIENT!");
sc = server.acceptAndOpen();
main.setText("CLIENT CONNECT!");


из этого кода выполняеться только первая строка, а на второй строке просто зависает и всё. ошибки не появляються, просто виснет.
НО если запустить не на сотовом а на эмуляторе на компе то всё работает норм
PM MAIL   Вверх
W0LF
Дата 21.2.2009, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



потому что сначала у сервера нужно взять host
вот у тебя там в метод start() передавался cIP. откуда ты его брал??
тебе сначала нужно взять у серверсокета getLocalAddress() это и есть хост, а потом на него рубиццо с клиента

Добавлено через 5 минут и 12 секунд
нашел. ты его вычитываешь с какого-то пхпшного сервака. он втупую ОК возвращает....
то есть ты коннектишься к OK хосту???
смысл такой - создаешь сервер сокет, узнаешь хост, отправляешь например смской куда-нидь клиенту этот хост, далее клиент берет этот хост и рубиццо к нему по сокету.
НО, не все операторы определяют нормально хост, с этим траблов в поряде может быть



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
alexdrob
Дата 21.2.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(W0LF @ 21.2.2009,  03:47)
потому что сначала у сервера нужно взять host
вот у тебя там в метод start() передавался cIP. откуда ты его брал??
тебе сначала нужно взять у серверсокета getLocalAddress() это и есть хост, а потом на него рубиццо с клиента

Добавлено @ 03:53
нашел. ты его вычитываешь с какого-то пхпшного сервака. он втупую ОК возвращает....
то есть ты коннектишься к OK хосту???
смысл такой - создаешь сервер сокет, узнаешь хост, отправляешь например смской куда-нидь клиенту этот хост, далее клиент берет этот хост и рубиццо к нему по сокету.
НО, не все операторы определяют нормально хост, с этим траблов в поряде может быть

php файл по очереди возвращает либо OK либо IP адрес. это просто зделанно чтобы первый подключивщийся был сервер  второй клиент.
но проблемма не в том. адрес нужен клиенту а виснет серв на строке

Код

server = (ServerSocketConnection) Connector.open("socket://:3128");

т.е. весь код до этой строки выполняеться а после неё нет. доходит до неё и останавливаеться. не каких ошибок не вылетает.

НО не работает только если запустить на сотовом, пробовал на разных и на разных сетях. с компа с эмулятара серв запускаеться и работает.

PM MAIL   Вверх
W0LF
Дата 22.2.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Код

main.setText("YOU SERVER!");
server = (ServerSocketConnection) Connector.open("socket://:3128");
main.setText("WAIT CLIENT!");
sc = server.acceptAndOpen();
main.setText("CLIENT CONNECT!");

теперь давай разберемся:
на телефоне меняется текст на "YOU SERVER!"
а потом "WAIT CLIENT!" не показывается
а на эмуляторе показывается?
Вообще это плохая практика - менять гуй из другого потока, не синхронизируя, например блекберри не позволит такое сделать..
в j2me это вроде как разрешается.
то есть у тебя меняется на дисплее текст на - YOU SERVER! ?
Второй вопрос, который меня интересует - а где пхпшный сервак берет айпишник для твоего сервер-телефона?
он ему что, сам его придумывает?


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
alexdrob
Дата 23.2.2009, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да текст меняеться на YOU SERVER

IP берётся так: запускаю сотовый он обращаеться к пхп файлу этот файл проверяет текстовый файл на сервере, если он пустой то он записывает туда IP того телефона который обратился, потом второй телефон обращаеться к файлу файл проверяет текстовый файл и берёт оттуда IP первого телефона и отправляет второму телефону.

Но с IP проблем нет, серверу IP вообще не нужен. это клиенту нужен, но клиент работает и конектится, если эмулятор с компа запустить.

Мне сказали что NAT сотовых провайдеров не пропускает пакеты к сотовым. Т.е. на телефоне серв типа не запустится, только клиент.
PM MAIL   Вверх
W0LF
Дата 23.2.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Ну у меня ж он какого-то фига два года назад запускался на sonyericsson k500i а со временем и на nokia3250..
Кароче, к чему я все веду. Мне кажеццо, что у тебя реально виснет на 
Код

sc = server.acceptAndOpen();

и ждет, что клиент не могет подконнектиться.
Цитата

если он пустой то он записывает туда IP того телефона который обратился

проверь пожалуйста, айпи, который взял сервер и тот, который вернул getLocalAddress() одинаковы?
открой просто на телефоне серверсокет, выведи для себя его getLocalAddress() возьми у него же, а потом просто в другом телефоне перед запуском сделай возможность ввода айпишника, введи его и подконнектись с ним к серверу. просто попробуй сделать так


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
alexdrob
Дата 25.2.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вообщем я сделал серв на яве на компе запускаю, оба телефона конектятся и игра заработала))
PM MAIL   Вверх
W0LF
Дата 25.2.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



ну, это как бы оптимальное решение =)))



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
gosnis
Дата 25.2.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.5.2007
Где: Тель Авив, Израил ь

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



Цитата(alexdrob @ 25.2.2009,  01:05)
вообщем я сделал серв на яве на компе запускаю, оба телефона конектятся и игра заработала))

На мой взгляд, самое правильное решение. Game engine, сидит на сервере, а клиенты только прорисовывают текущее положение. По идее это должно облегчить и работу аппликации. Учитывая ограничения в ресурсах и мощностях телефонов, это только на пользу.
PM MAIL ICQ Skype MSN   Вверх
alexdrob
Дата 26.2.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



у меня возник вопрос, у меня есть клас NetSocket он не наследник других класов
Код

public class NetSocket{
    public Socket sock;
    private InputStream is;
    private OutputStream os;
.........

Thread t = new Thread(){
            @Override
            public void run(){
                while (act == true){
                    read();
                }
            }
        };
        t.start();


а в класе Main есть Vector

Код

v.add(new NetSocket(sSocket.accept(), 30000, stack, v));


т.е. я передаю указатель на вектор в класс, если я в класе сделаю так
Код

act  = false;
v.remove(this);


то из памяти обьект удалиться? просто память при новом соединении увеличиваеться а при отключении уменьшаеться но не на столько на сколько увеличилась. 
PM MAIL   Вверх
gosnis
Дата 26.2.2009, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.5.2007
Где: Тель Авив, Израил ь

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



Цитата(alexdrob @ 26.2.2009,  00:17)
просто память при новом соединении увеличиваеться а при отключении уменьшаеться но не на столько на сколько увеличилась.

Garbage collector срабатывает раз в какое то время. Никто не гарантирует, что память освободится сразу после того, как вы обнуллили референс на объект. Может дело в этом?
PM MAIL ICQ Skype MSN   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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