Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2009, 13:15   #1
sum42
Пользователь
 
Регистрация: 15.11.2008
Сообщений: 33
По умолчанию передача строки с телефона на комп через интернет на Java

Здравствуйте!
Передо мной стоит следующая задача:
нужно отправить текстовую строку с телефона на комп через интернет. На компе должна
быть запущена консольная
серверная программа на Java, которая должна вывести принятую строку на экран, а на телефоне
запущено приложение на j2me в котором просто нужно нажать на кнопку для передачи строки.

серверная программа на компе прослушивает порт 6666, а приложение на телефоне связывается
с компом через его ip-адрес в интернете и порт 6666. У меня adsl-подключение, поэтому ip-адрес
не всегда остается постоянным, но меняется нечасто(ip-адрес я здесь написал неверный, какой порт
выбирать неважно). Свой ip-адрес я узнаю на сайте http://2ip.ru/. Телефон у меня Nokia 6151.

При нажатии на кнопку для передачи строки приложение на телефоне зависает,
а серверная программа ничего не принимает. Я недавно начал изучать Java, поэтому мои знания пока совсем
примитивные, но мне необходимо решить данную задачу для того чтобы суметь сделать курсовую работу.
Помогите пожалуйста.

вот исходный код серверной программы
(писал я его естественно не сам, а взял из одной статьи и немного изменил):

Код:
import java.net.*;
import java.io.*;

public class server {
   public static void main(String[] ar)    {
     int port = 6666;
       try {
         ServerSocket ss = new ServerSocket(port);
         System.out.println("Waiting for a client...");

         Socket socket = ss.accept();
         System.out.println("Got a client ... Finally, someone saw me through all the cover!");
         System.out.println();

         InputStream sin = socket.getInputStream();
         OutputStream sout = socket.getOutputStream();

         DataInputStream in = new DataInputStream(sin);
         DataOutputStream out = new DataOutputStream(sout);

         String line = null;
         while(true) {
           line = in.readUTF();
           System.out.println("The dumb client just sent me this line : " + line);
           System.out.println("Waiting for the next line...");
           System.out.println();
         }
      } catch(Exception x) { x.printStackTrace(); }
   }
}

вот исходный код приложения на телефоне
(его я сам составил из разных статей и исходя из своих небольших знаний в j2me):

package hello;

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

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

public class HelloMIDlet extends MIDlet implements CommandListener {

	private Display display;
	private Form addressForm;
	private Command okCommand;
	private Command exitCommand;
	private StringItem messageLabel;

    public void startApp() {
        display = Display.getDisplay(this);

		exitCommand = new Command("Exit", Command.EXIT, 0);
		okCommand = new Command("Send mes", Command.OK, 0);

		addressForm = new Form("Socket Client form");
		messageLabel = new StringItem("hello world!!","hello world22222!!");
		
		addressForm.append(messageLabel);
		addressForm.addCommand(okCommand);
		addressForm.addCommand(exitCommand) ;
		addressForm.setCommandListener(this);
		display.setCurrent(addressForm);
    }

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {}

	public void commandAction(Command cmd, Displayable d) {
		if (cmd == okCommand) {
			try{
			  SocketConnection sc = (SocketConnection)Connector.open("socket://11.11.111.111:6666");
			  OutputStream os = null;
			  try{
					os = sc.openOutputStream();
					byte[] data = "Hello from a socket!".getBytes();
					os.write(data);
					StringItem messageLabel2 = new StringItem(null,"mes was send!");
					addressForm.append(messageLabel2);
			  } finally{
				  sc.close();
				  os.close();
			  }
			} catch (IOException x){
			 x.printStackTrace();
			}  
		} else if (cmd == exitCommand) {
			try {
			destroyApp(true);
			} catch (Exception ex) {}
			notifyDestroyed();
		}
	}
}
Замечание модератора: Используйте тег [CODE]

Последний раз редактировалось Rembo; 25.10.2009 в 15:37.
sum42 вне форума Ответить с цитированием
Старый 25.10.2009, 13:47   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

эх, давно юзал j2me...с основным мидлетом у вас все в порядке, а вот с работу с сокетом раньше делал так
Код:
public void run() {
  String name = cg.getString(cg.getSelectedIndex());
  if (name.equals(SERVER)) {
  try {
    f1 = new Form("Socket - сервер");
    si = new StringItem("Status:", " ");
    tf = new TextField("Send:", "", 30, TextField.ANY);
    f1.append(si);
    f1.append(tf);
    f1.addCommand(backCommand);
    f1.addCommand(sendCommand);
    f1.setCommandListener(this);
    Display.getDisplay(midlet).setCurrent (f1);

    si.setText("Waiting for connection");
    scn = (ServerSocketConnection) Connector.open("socket://:"+port2);
    sc = (SocketConnection) scn.acceptAndOpen();
    si.setText("Connection accepted");
    is = sc.openInputStream();
    os = sc.openOutputStream();
    sender = new Sender(os);

    while (true) {
      StringBuffer sb = new StringBuffer();
      int c = 0;
      while (((c = is.read()) != '\n') && (c != -1)) {
      sb.append((char) c);}
      if (c == -1) {break;}
      si.setText("Принято - " + sb.toString()); t.play(90);
    }

      stop();
      si.setText("Connection is closed");
      f1.removeCommand(sendCommand);
      } catch (IOException ioe) {
            if (ioe.getMessage().equals("ServerSocket Open")) {
                Alert a = new Alert("Server", "Порт занят.",
                        null, AlertType.ERROR); 
                a.setTimeout(Alert.FOREVER);
                a.setCommandListener(this);
                Display.getDisplay(midlet).setCurrent(a);
            } else {
                if (!stop) {
                    ioe.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 } 
 else {
  try {
    f2 = new Form("Socket - клиент");
    si = new StringItem("Status:", " ");
    tf = new TextField("Send:", "", 140, TextField.ANY);
    f2.append(si);
    f2.append(tf);
    f2.addCommand(backCommand);
    f2.addCommand(sendCommand);
    f2.setCommandListener(this);
    Display.getDisplay(midlet).setCurrent (f2);

    sc = (SocketConnection) Connector.open("socket://"+host2+":"+port2);
    si.setText("Connected...");
    is = sc.openInputStream();
    os = sc.openOutputStream();
    sender = new Sender(os);
    while (true) {
      StringBuffer sb = new StringBuffer();
      int c = 0;
      while (((c = is.read()) != '\n') && (c != -1)) {sb.append((char) c);}
      if (c == -1) {break;}
      si.setText("Принято - " + sb.toString()); t.play(90);
      //log-

      }
      stop();
      si.setText("Disconnect...");
      f2.removeCommand(sendCommand);
      } catch (ConnectionNotFoundException cnfe) {
           Alert a = new Alert("Client", "Please run Server MIDlet first",
                    null, AlertType.ERROR);
            a.setTimeout(Alert.FOREVER);
            a.setCommandListener(this);
            Display.getDisplay(midlet).setCurrent(a);
        } catch (IOException ioe) {
            if (!stop) {
                ioe.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 }
}


public void stop() {
        try {
            stop = true;
            if (is != null) {
                is.close();
            }
            if (os != null) {
                os.close();
            }
            if (sc != null) {
                sc.close();
            }
            if (scn != null) {
                scn.close();
            }
        } catch (IOException ioe) {}
    }


}
- сравнивайте... и почитать http://raxp.radioliga.com/cnt/s.php?p=ma.pdf
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 27.10.2009, 22:54   #3
sum42
Пользователь
 
Регистрация: 15.11.2008
Сообщений: 33
По умолчанию

спасибо большое.
статью из книги прочитал, но мою проблему это не решило.
мне очень тяжело понять такой сложный код без комментариев, не могли бы вы немного пояснить его.
я так понял у меня с серверной программой что то не так. А что именно?
sum42 вне форума Ответить с цитированием
Старый 27.10.2009, 23:53   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1) что делает вот это
Цитата:
String line = null;
while(true) {
line = in.readUTF();
?
2)
Цитата:
я так понял у меня с серверной программой что то не так
чтобы найти сервер щалит или клиент, для начала хорошо-бы клиента другого наваять (на java или delphi (clientsocket) или на чем сможете) и убедиться что на компе он соединяется, тогда вариант сервера отпадет и останется:
- файрволл на вашей машине
- не открыт порт для этого сокета на роутере или adsl-модеме (перебросить порты, открыть)
- оператор закрыл порт и использует другие (лично у меня на юмс подключение gprs стоят порты 8080, как у вас не знаю)... вот по-последнему... когда ваше приложение соединяется, то 1- телефон должен спросить- разрешить выход? (у вас спрашивает?) 2- зависон может быть из-за закрытого порта 3- нет связи с вашим сервером
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 27.10.2009 в 23:55.
raxp вне форума Ответить с цитированием
Старый 29.10.2009, 03:12   #5
sum42
Пользователь
 
Регистрация: 15.11.2008
Сообщений: 33
По умолчанию

Код:
String line = null;
while(true) {
    line = in.readUTF();
    System.out.println("The dumb client just sent me this line : " + line);
    System.out.println("Waiting for the next line...");
    System.out.println();
}
Здесь у меня бесконечный цикл при помощи которого ожидается передача строки от клиента,
потом строка выводится на экран и все повторяется по новой - ожидаются другие строки,
пока не завершится сеанс связи.
Код:
String line = null;
этот код наверно можно сократить до
Код:
String line;
вот ссылка на статью откуда я взял код сервера: http://www.quizful.net/post/java-socket-programming
там описываются клиент и сервер на Java, которые запускаются и взаимодействуют на одном компе.
при их использовании у меня все работает, строки принимаются и передаются как надо.
и потом я решил попробовать использовать серверную программу оттуда для решения своей задачи
(передача строки с телефона на комп через интернет на Java).

брандмауэр у меня выключен, касперского на время испытаний я отключил.

модем у меня вот такой:
adsl router
d-link dsl-2500u

порт 6666 открыл как описано вот здесь: http://friends-forum.com/forum/showthread.php?t=69554

при нажатии на кнопку для передачи строки мой телефон спрашивает меня:
разрешить доступ к сети?

потом выполняется подключение к сети Beeline Internet.
никакой строки на сервер не передается, а приложение на телефоне висит
(это я определяю по неработающей кнопке Exit)

денег с телефона за передаваемый трафик не сняли(значит я так понял никаких данных через
интернет не передалось).

Попробовал проделать все то же самое с портом 8080, на что моя nokia 6151
сразу же при нажатии на кнопку без всяких подключений выдала ошибку приложения

Security
java/lang/Security
Exception
Untrusted MIDlet
attempted to
connect to a
restricted port

у меня сейчас мысли такие:
узнать порт подключения gprs на моем beeline и попробовать еще раз.

наведите пожалуйста меня на путь истины, если есть какие-нибудь соображения по этой задаче.
sum42 вне форума Ответить с цитированием
Старый 29.10.2009, 09:56   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
узнать порт подключения gprs на моем beeline
уже говорил проверить...
Цитата:
- оператор закрыл порт и использует другие (лично у меня на юмс подключение gprs стоят порты 8080, как у вас не знаю)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.11.2009, 02:01   #7
sum42
Пользователь
 
Регистрация: 15.11.2008
Сообщений: 33
По умолчанию

raxp, большое спасибо за помощь.
порт подключения gprs на моем beeline я еще не узнал, но у меня возник серьезный вопрос:

я прочитал статью про внутренние и внешние Ip-адреса.
понял, что у меня внутренний ip-адрес внутри сети провайдера,
а не внешний ip, как я думал раньше.
возможно ли решить мою задачу с использованием внутреннего ip?
если да, то как это сделать(в общих чертах)?

(сам я, после прочтения статей про порты и Ip-адреса думаю что нельзя)
sum42 вне форума Ответить с цитированием
Старый 05.11.2009, 09:00   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

верно... именно поэтому основная идея и реализация в моей статье было использование внешнего сервера irq/icq. В сети достаточно открытых проектов типа bombus, jimm (sourceforge.net) на их основе с использованием j2me (хотя пользую- antenna), возьмите один из них и добавьте свою систему поверх (лучше irq)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 26.11.2009, 10:29   #9
sum42
Пользователь
 
Регистрация: 15.11.2008
Сообщений: 33
По умолчанию

данные с телефона на комп и обратно с компа на телефон я наконец-то отправил.
примерно также как я изначально пытался, но с небольшими изменениями в кодах клиента и сервера.
мне посоветовали на другом форуме использовать для подключения порт 8090. Но возможно все будет работать и с другими портами, я не проверял после изменений в кодах программ.
я перечитал статьи http://ru.wikibooks.org/wiki/Порт и http://ru.wikibooks.org/wiki/Порт/NAT,
все обдумал и оказалось что у меня внешний динамический ip-адрес, т.к. я бы не смог открыть необходимый порт на маршрутизаторе, если бы это было не так.
sum42 вне форума Ответить с цитированием
Старый 26.11.2009, 10:41   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
данные с телефона на комп и обратно с компа на телефон я наконец-то отправил
поздравляем с успешным выполнением задачи
Цитата:
мне посоветовали на другом форуме использовать для подключения порт 8090
если взглянете вверх, то про порты уже говорил ранее, неоднократно.
Цитата:
все обдумал и оказалось что у меня внешний динамический ip-адрес
об этом речь и шла.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц