HTTP-код сервера локального компьютера приложения UWP на одном компьютере - PullRequest
0 голосов
/ 04 сентября 2018

Я не могу заставить свое приложение Codename One UWP взаимодействовать через HTTP с сервером, работающим на той же машине. Приложение работает в симуляторе, подключающемся к localhost, и я могу подключиться к своей машине по ее IP-адресу локальной сети, когда она работает на реальном устройстве Android. Я нашел похожую проблему здесь:

https://github.com/codenameone/CodenameOne/issues/2056

И добавил подсказку сборки windows.capabilities. К сожалению, связь по-прежнему не работает таким же образом. Мой файл AppxManifest.xml содержит следующее:

<Capabilities>
  <Capability Name="privateNetworkClientServer"/>
  <Capability Name="internetClient"/>
  <uap:Capability Name="picturesLibrary"/>
  <uap:Capability Name="videosLibrary"/>
  <uap:Capability Name="removableStorage"/>
  <uap:Capability Name="musicLibrary"/>
</Capabilities>

Ошибка в трассировке стека такая же, как и в приведенной выше ссылке (Сообщение = Произошла ошибка при отправке запроса. Не удалось найти текст, связанный с этим кодом ошибки. ... Не удалось установить соединение с сервером установлены). Сервер никогда не получает запрос.

Я попытался подключиться к "127.0.0.1", "localhost" и всем IP-адресам моей локальной сети.

Я создал тестовую программу, которая показывает проблему. Для проверки запустите программу для захвата трафика, отправляемого на порт (http://www.linklogger.com/portpeeker.htm в Windows работает). Теперь попробуйте подключиться к нему, используя свой IP-адрес локальной сети.

import java.io.*;
import com.codename1.io.*;
import com.codename1.ui.*;
import com.codename1.ui.events.ActionEvent;
import com.codename1.ui.layouts.BoxLayout;
import com.codename1.ui.plaf.UIManager;

public class LocalServerTest {
    private final StringBuffer logContents = new StringBuffer();

    private volatile TextArea logTextArea;

    public void init(Object context) {
        Log.install(new Log() {
            @Override
            protected Writer createWriter() throws IOException {
                return new Writer() {
                    @Override
                    public void write(char[] cbuf, int off, int len) throws IOException {
                        logContents.append(new String(cbuf, off, len));
                        if (logTextArea != null) {
                            Display.getInstance().callSerially(() -> {
                                logTextArea.setText(logContents.toString());
                                logTextArea.getParent().revalidate();
                            });
                        }
                    }

                    @Override
                    public void flush() throws IOException {
                    }

                    @Override
                    public void close() throws IOException {
                    }
                };
            }
        });

        UIManager.initFirstTheme("/theme");
    }

    public void start() {
        logTextArea = new TextArea(logContents.toString());
        logTextArea.setRows(40);

        NetworkManager.getInstance().setTimeout(5 * 1000);

        Form hi = new Form("Test local server connection", BoxLayout.y());
        TextField ipAndPortField = new TextField("", "IP:port");
        hi.add(ipAndPortField);
        hi.add(new Button(new Command("Test") {
            @Override
            public void actionPerformed(ActionEvent evt) {
                ConnectionRequest request = new ConnectionRequest() {
                    @Override
                    protected void buildRequestBody(OutputStream os) throws IOException {
                        os.write(new String("Some test data").getBytes("utf-8"));
                    }

                    @Override
                    protected void handleException(Exception err) {
                        Log.p("Could not communicate with server", Log.ERROR);
                        Log.e(err);
                    }
                };
                request.setUrl("http://" + ipAndPortField.getText() + "/test");
                request.setPost(true);
                request.setFailSilently(true);
                request.setTimeout(5 * 1000);
                request.setSilentRetryCount(0);
                request.setCookiesEnabled(false);
                request.setContentType("text/plain");
                request.addResponseCodeListener(e -> {
                    Log.p("Response code received: " + e.getMessage(), Log.INFO);
                });
                request.addResponseListener(e -> {
                    Log.p("Response received: " + e.getMessage(), Log.INFO);
                });
                Log.p("Sending request to " + request.getUrl(), Log.INFO);
                NetworkManager.getInstance().addToQueue(request);
            }
        }));
        hi.add(logTextArea);
        hi.show();
    }

    public void stop() {
    }

    public void destroy() {
    }
}
...