#java #android #python
#java #Android #python
Вопрос:
Я пытаюсь подключить свой телефон к ноутбуку с помощью Wi-Fi. Оба устройства подключены к одной сети. У ноутбука IP 192.168.1.35, поэтому я попытался подключиться к этому IP через смартфон (брандмауэр отключен). Вот код:
package org.me.androidapp;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
try {
Toast.makeText(this.getApplicationContext(), "OK", Toast.LENGTH_LONG).show();
Socket socket = new Socket("192.168.1.35", 9999);
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
out.println("dupa");
socket.close();
} catch (UnknownHostException ex) {
Toast.makeText(this.getApplicationContext(), "Nie odnaleziono hosta", Toast.LENGTH_LONG).show();
Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Toast.makeText(this.getApplicationContext(), ex.toString(), Toast.LENGTH_LONG).show();
Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Я использую этот код (написанный на python) в качестве сервера:
import socket
_connector = None
_running = True
_host = 'localhost'
_port = '9999'
_maxClient = 999
debug = True
_policyFile = '<?xml version="1.0" encoding="UTF-8"?><cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd"><allow-access-from domain="*" to-ports="*" secure="false" /><site-control permitted-cross-domain-policies="master-only" /></cross-domain-policy>'
## Trace debugging messages.
# @param aString String to be printed.
def printd( aString ):
if debug:
print aString
_connector = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
_connector.bind ( ( str(_host), int(_port) ) )
_connector.listen ( int(_maxClient) )
_running = True
while _running:
printd('Running on port ' _port ' ... ')
channel, details = _connector.accept()
if _running:
printd( 'New connection with: ' str(details) )
channel.setblocking( 1 )
recvData = channel.recv(2000)
if("policy-file-request" in recvData):
channel.send(_policyFile)
printd( 'host: ' str(details[0]) )
printd( 'port: ' str(details[1]) )
printd( 'port: ' str(int(details[1])) )
channel.close()
Я тестирую это приложение на своем телефоне, потому что я не уверен, как настроить эмулятор (любая помощь? :)). Телефон показывает ошибку «Java.Net.ConnectionError localhost / 192.168.1.1:9999 — соединение отклонено». Мне также интересно, почему он показывает IP 192.168.1.1…
Пожалуйста, помогите, Крис
Комментарии:
1. У меня ваш сервер python работает нормально (подсказка:
telnet localhost 9999
это хороший способ проверить). Можем ли мы увидеть трассировку стека из logcat?
Ответ №1:
ваш код python привязан к localhost, что означает, что он прослушивается не в сети, а только в режиме обратной связи, поэтому вам следует изменить его, чтобы он прослушивал сетевой адрес (т. е. 192.168.1.35) компьютера, а не 127.0.0.1
Комментарии:
1. хорошая уловка, в качестве альтернативы вы можете выполнить привязку к 0.0.0.0, что, на мой взгляд, немного проще и надежнее.
2. Хорошо, вторая проблема была связана с приложением для Android, но я решил ее. Порт 9999 не был готов к использованию, я сменил порт, и теперь все работает 🙂 Спасибо!