Я не могу заставить свое приложение 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() {
}
}