2016-03-16 2 views
0

У меня есть сервер сокетов python, к которому подключаются мои устройства Android, но мой эмулятор Android может подключаться к нему, но мой телефон не может подключиться к нему и дает ошибку ETIMEDOUT. Может ли кто-нибудь сказать, что с ним не так? СерверНе удается подключить мое устройство Android к моему серверу сокетов python?

Python:

import socket    
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   
    host = socket.gethostname() 
    port = 12345     
    s.bind((host, port))   
    s.listen(10)     
    while True: 
     c, addr = s.accept()  
     print(addr) 
     c.send(bytes('Thank you for connecting','utf-8')) 
     c.close() 

Android Клиент: Client.java:

package com.example.abhishekroul.clientapp; 
    import android.os.AsyncTask; 
    import android.widget.TextView; 

    //import java.io.ByteArrayInputStream; 
    import java.io.ByteArrayOutputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.net.Socket; 
    import java.net.UnknownHostException; 
    public class Client extends AsyncTask<Void,Void,Void> 
    { 
     String dstAddress; 
int dstPort; 
String response=""; 
TextView textResponse; 
Client(String addr,int port, TextView textResponse) 
{ 
    dstAddress=addr; 
    dstPort=port; 
    this.textResponse=textResponse; 
} 

@Override 
protected Void doInBackground(Void ...arg0) 
{ 
    Socket socket=null; 
    try 
    { 
     socket=new Socket(dstAddress,dstPort); 
     ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(1024); 
     byte[] buffer=new byte[1024]; 
     int bytesRead; 
     InputStream inputStream= socket.getInputStream(); 
     while((bytesRead=inputStream.read(buffer))!=-1) 
     { 
      byteArrayOutputStream.write(buffer,0,bytesRead); 
      response += byteArrayOutputStream.toString("UTF-8"); 
     } 
    } 
    catch(UnknownHostException e) 
    { 
     e.printStackTrace(); 
     response="UnknownHostException:"+e.toString(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
     response="IOException:"+e.toString(); 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(Void result) 
{ 
    textResponse.setText(response); 
    super.onPostExecute(result); 
} 
} 

MainActivity.java:

package com.example.abhishekroul.clientapp; 

    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.TextView; 

    public class MainActivity extends AppCompatActivity { 

EditText address, port; 
TextView response; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    address = (EditText) findViewById(R.id.address); 
    port = (EditText) findViewById(R.id.port); 
    response = (TextView) findViewById(R.id.response); 

} 

public void funcConnect(View v) 
{ 
    Client client= new Client(address.getText().toString(),Integer.parseInt(port.getText().toString()),response); 
    client.execute(); 
} 

public void funcClear(View v) 
{ 
    response.setText(""); 
} 


} 

Manifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.abhishekroul.clientapp" > 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" > 
    <activity android:name=".MainActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

на эмуляторе его соединение, но на телефоне Android он показывает ошибку ETIMEDOUT.

+0

Проблема может зависеть от IP-адреса. Что вы вводите в адресном редакторе EditText? Является ли это видимым с устройства? Связано ли это с Wi-Fi-сетью? – KLiFF

+0

да, он подключается через Wi-Fi и обычно вводит ip-адрес, который я получаю через мой компьютер, используя команду cmd ipconfig –

+0

У вас может быть либо брандмауэр, либо антивирус, блокирующий вызов. Попробуйте сделать telnet с другого компьютера, подключенного к той же сети: «telnet ip_address port». – KLiFF

ответ

0

Итак, после серии испытаний я нашел решение проблемы, используя порт 80 HTTP-протокол, который, как правило, никогда не блокируется, поскольку процессы на основе HTTP останавливаются, поскольку этот порт обычно используется этим протоколом, поэтому лучше пользовательский порт 80 для создания сокетов.

Смежные вопросы