Между сервером и клиентом установлено соединение, но невозможно отправить данные через OutputStream в J2ME - PullRequest
1 голос
/ 04 января 2011

Я недавно начал программировать клиент-серверные приложения на J2ME. Теперь я работаю с независимыми компонентами c ++ builder 2010 (например, TidTTCPServer) и J2ME.Мое приложение предназначено для перезапуска службы межсетевого экрана kerio winroute с удаленного компьютера.Мое серверное приложение написано на C ++ Builder 2010, я поместил компонент TidTCTServer в форму, привязанную к 127.0.0.1:4500.Это прослушивает порт 4500 на локальной машине.Затем я добавил список, в который мне нужно добавлять все последующие пакеты, конвертированные в UnicodeString.

//void __fastcall TForm1::servExecute(TIdContext *AContext)

        UnicodeString s;
 UnicodeString txt;
 txt=Trim(AContext->Connection->IOHandler->ReadLn());
 otvet->Items->Add(txt);
 otvet->ItemIndex=otvet->Items->Count-1;
 if (txt=="1") {
   AContext->Connection->IOHandler->WriteLn("Suhrob");
   AContext->Connection->Disconnect();
 }
 if (txt=="2") {
   AContext->Connection->IOHandler->WriteLn("Shodi");
   AContext->Connection->Disconnect();
 }

// ----------------------------------------------------------------------------

// void __fastcall TForm1::servConnect(TIdContext *AContext)

  ++counter;
 status->Panels->Items[0]->Text="Connections:" + IntToStr(counter);
 status->Panels->Items[1]->Text="Connected to " + AContext->Connection->Socket->Binding->PeerIP + ":" + AContext->Connection->Socket->Binding->PeerPort;

и мой клиенткод выглядит примерно так:

else if (command == send) {                                          
     // write pre-action user code here
            InputStream is=null;
            OutputStream os=null;
            SocketConnection client=null;
            ServerSocketConnection server=null;
            try {
                server = (ServerSocketConnection) Connector.open("socket://"+IP.getString()+":"+PORT.getString());
                // wait for a connection
                client = (SocketConnection) Connector.open("socket://"+IP.getString()+":"+PORT.getString());
                // set application-specific options on the socket. Call setSocketOption to set other options
                client.setSocketOption(SocketConnection.DELAY, 0);
                client.setSocketOption(SocketConnection.KEEPALIVE, 0);
                is = client.openInputStream();
                os = client.openOutputStream();
                // send something to server
                os.write("texttosend".getBytes());
                // read server response
                int c = 0;
                while((c = is.read()) != -1) {
                   // do something with the response
                    System.out.println((char)c);
                }

                // close streams and connection
            }
             catch( ConnectionNotFoundException error )
           {
                 Alert alert = new Alert(
                    "Error", "Not responding!", null, null);
                 alert.setTimeout(Alert.FOREVER);
                 alert.setType(AlertType.ERROR);
                 switchDisplayable(alert, list);
            }
            catch (IOException e)
            {
                 Alert alert = new Alert("ERror", e.toString(), null, null);
                 alert.setTimeout(Alert.FOREVER);
                 alert.setType(AlertType.ERROR);
                 switchDisplayable(alert, list);
                 e.printStackTrace();

            }

          finally {
          if (is != null) {
            try {
              is.close();
            } catch (Exception ex) {
              System.out.println("Failed to close is!");
            }
            try {
              os.close();
            } catch (Exception ex) {
              System.out.println("Failed to close os!");
            }
          }
          if (server != null) {
            try {
              server.close();
            } catch (Exception ex) {
              System.out.println("Failed to close server!");
            }
          }
          if (client != null) {
            try {
              client.close();
            } catch (Exception ex) {
              System.out.println("Failed to close client!");
            }
          }
        }

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

os.write("texttosend".getBytes());

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

txt=Trim(AContext->Connection->IOHandler->ReadLn()); 

Ребята, где я не прав?это способ, которым я делаю, в порядке?

Или мне нужно использовать StreamConnection вместо SocketConnection?

И когда я использую telnet для отправки данных, это здорово работает, строки добавляются вlistbox

telnet 127.0.0.1 4500

texttosend
23
asf

Любая помощь приветствуется !!!Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 06 января 2011

Да, метод flush необходимо вызывать после отправки байтов, но ..... наконец .... Затем я попытался включить мой код подключения в новый поток, который реализует Runnable работал отлично. Теперь я нашел, где я был не прав !!!!!!!!!!!!!!

Это парни, вам нужно включить приведенный выше код в следующий блок.

Thread t= new Thread(this);
t.start();
public void run()
{
//here paste the code
}
1 голос
/ 07 января 2011

Основная проблема в том, что вы используете ReadLn() на стороне сервера.ReadLn() не завершается, пока не встретится терминатор данных (LF символ разрыва строки является терминатором по умолчанию) или если произойдет таймаут чтения (Indy по умолчанию использует бесконечные таймауты).Ваш код J2ME не отправляет никакой терминатор данных, поэтому ReadLn() нечего сказать, когда прекратить чтение.Причина, по которой он работает с Telnet, заключается в том, что он отправляет символы разрыва строки.

Другая проблема с вашим кодом состоит в том, что TIdTCPServer является многопоточным компонентом, но ваш код обновляет компоненты пользовательского интерфейса в потокенебезопасная манераВы ДОЛЖНЫ синхронизироваться с основным потоком, например, используя классы TIdSync и / или TIdNotify в Indy, чтобы безопасно обновлять свой пользовательский интерфейс изнутри обработчиков событий сервера.

0 голосов
/ 04 января 2011

Попробуйте OutputStream.flush () ?

Если нет, попробуйте выполнить запись на известный рабочий сервер, а не на тот, который вы создали самостоятельно (что-то вроде запись "HELO"SMTP-серверу ), это поможет вам выяснить, в каком конце находится ошибка.

...