Проблема с использованием сокета для подключения к ПК

#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 не был готов к использованию, я сменил порт, и теперь все работает 🙂 Спасибо!