Brak połączenia client - server z wykorzystaniem klasy Socket na Androidzie.

0

Witam wszystkich forumowiczów.

Chcę zrobić małą aplikacje na telefon która będzie wysyłać pewne dane na komputer. W chwili obecnej kod klienta wygląda tak:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class AndroidClient extends Activity {

private Socket client;
private PrintWriter printwriter;
private Button button;
private String messsage;
int port = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    button = (Button) findViewById(R.id.send);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            messsage = "Witam pana, panie Server ";

            port = 8888;

            new Thread(new Runnable() 
            {

                @Override
                public void run() {            

                    try 
                    {
                        client = new Socket("localhost", port);
                        printwriter = new PrintWriter(client.getOutputStream(),true);
                        printwriter.write(messsage);
                        printwriter.flush();
                        printwriter.close();
                        client.close();
                    }

                    catch (UnknownHostException e) {
                        e.printStackTrace();
                    } catch (IOException e) {

                        e.printStackTrace();
                    }       
                }
            }).start();
        }
    });
}

}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.graphicstablet_client"
    android:versionCode="1"
    android:versionName="1.0" >
    

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

        <uses-permission android:name="android.permission.INTERNET" />
    	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".AndroidClient"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

A kod serwera tak:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class MyServer {
 
 public static void main(String[] args){
	 ServerSocket serverSocket = null;
		while (true) {
			
			try {
				serverSocket = new ServerSocket(8888);

				Socket clientSocket = serverSocket.accept();

				BufferedReader inputReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
				
				System.out.println("Client said :"+inputReader.readLine());

			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				try {
					serverSocket.close();
				
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
 }

Testowałem już serwer odpalając klienta bez kodu androida i wszystko działało (serwer otrzymywał dane), lecz kiedy chce skorzystać z tej aplikacji na telefonie to pomimo włączonego serwera żadne dane nie ukazują się na wyjściu.

Proszę o pomoc bo użeram się z tym już dłuższy czas nie mam pojęcia co mogę jeszcze zrobić. Z góry dzięki za pomoc.

1

W kodzie masz
client = new Socket("localhost", port);
Odpalasz tą apke androidową na emulatorze, czy na własnym telefonie? Mam nadzieję, że nie na własnym telefonie...

BTW. w kodzie servera wyciągnij serverSocket = new ServerSocket(8888); przed while(true), a w bloku finally zamykaj client socketa. Nie ma sensu za każdym przejściem pętli tworzyć nowego server socketa.

0

Odpalam ją na własnym telefonie. Na emulatorze również testowałem i nie działała. Wpisywałem również ip mojego komputera po sprawdzeniu go za pomocą ipconfig w cmd (192.168.0.100) i również kilka innych ip i żadne nie chciało działać.

Co do servera to masz rację, już poprawione. Dodam również że korzystam z kilku aplikacji do wymiany plików z androida na komputer i one działają bezproblemowo.

1

Ajjjj.... przydałoby się trochę wiedzy o "ogólnopojętych" sieciach. Gdy masz wpisane localhost to próbujesz się połączyć z własnym telefonem, gdzie oczywiście servera nie masz. Twój IP z ipconfiga to IP wewnętrzny, który przydzielił Ci router. Tym sposobem mógłbyś się połączyć, gdybyś był w tej samej podsieci. Na przykład, kiedy podłączysz się telefonem pod swoje wifi, to powinno zadziałać. Jeżeli jednak korzystasz z transmisji danych to dostajesz całkowicie inne IP i musisz się połączyć ze swoim zewnętrznym IP. Dochodzi tutaj jeszcze kwestia przekierowania ruchu sieciowego na routerze na komputer, na którym jest uruchomiony server. Zewnętrzne IP możesz sprawdzić wpisując po prostu "IP" w Google. Odnośnie przekierowania to ustawiasz na routerze, że cały ruch sieciowy na porcie 8888 rzucasz na komputer o IP 192.168.0.100. Tutaj masz poradnik z obrazkami http://bit.ly/1BRegPd.

TL;DR
Jeżeli server i telefon są podłączone do Twojego routera w domu i łączysz się z 192.168.0.100 to powinno działać. Jeżeli nie, to daj znać, będziemy kombinować dalej.

Edit:
Skopiowałem ten Twój kod i wszystko działa zarówno przy połączeniu wewnątrz sieci routera jak i przez transmisję danych i zew. IP.

0
  1. Jeśli chodzi o przekierowywanie to próbowałem tego wcześniej jak i teraz i ono również nie działa.
  2. Server i telefon są w jednej sieci lan podłączone do routera i adres 192.168.0.100 nie działa.
  3. Skoro u ciebie działa to by oznaczało że kod jest bezbłędny a jedynie coś jest nie tak z moją siecią, wrzucam skan z ipconfig.
Konfiguracja IP systemu Windows

   Nazwa hosta . . . . . . . . . . . : Komputer01
   Sufiks podstawowej domeny DNS . . :
   Typ węzła . . . . . . . . . . . . : Hybrydowy
   Routing IP włączony . . . . . . . : Nie
   Serwer WINS Proxy włączony. . . . : Nie

Karta Ethernet Połączenie lokalne:

   Sufiks DNS konkretnego połączenia :
   Opis. . . . . . . . . . . . . . . : Atheros AR8151 PCI-E Gigabit Ethernet Con
troller (NDIS 6.20)
   Adres fizyczny. . . . . . . . . . : BC-5F-F4-1B-77-F8
   DHCP włączone . . . . . . . . . . : Tak
   Autokonfiguracja włączona . . . . : Tak
   Adres IPv6 połączenia lokalnego . : fe80::b89d:bba3:7137:2c9a%11(Preferowane)

   Adres IPv4. . . . . . . . . . . . . : 192.168.0.100(Preferowane)
   Maska podsieci. . . . . . . . . . : 255.255.255.0
   Dzierżawa uzyskana. . . . . . . . : 19 stycznia 2015 12:13:36
   Dzierżawa wygasa. . . . . . . . . : 19 stycznia 2015 14:13:36
   Brama domyślna. . . . . . . . . . : 192.168.0.1
   Serwer DHCP . . . . . . . . . . . : 192.168.0.1
   Identyfikator IAID DHCPv6 . . . . : 247226356
   Identyfikator DUID klienta DHCPv6 : 00-01-00-01-1B-58-63-FF-BC-5F-F4-1B-77-F8

   Serwery DNS . . . . . . . . . . . : 192.168.1.254
                                       192.168.0.1
   NetBIOS przez Tcpip . . . . . . . : Włączony

Karta tunelowa isatap.{FA2A0F5E-596E-4C7C-8B46-EF74969512A3}:

   Stan nośnika . . . .  . . . . . . .: Nośnik odłączony
   Sufiks DNS konkretnego połączenia :
   Opis. . . . . . . . . . . . . . . : Karta Microsoft ISATAP
   Adres fizyczny. . . . . . . . . . : 00-00-00-00-00-00-00-E0
   DHCP włączone . . . . . . . . . . : Nie
   Autokonfiguracja włączona . . . . : Tak

Karta tunelowa Teredo Tunneling Pseudo-Interface:

   Sufiks DNS konkretnego połączenia :
   Opis. . . . . . . . . . . . . . . : Teredo Tunneling Pseudo-Interface
   Adres fizyczny. . . . . . . . . . : 00-00-00-00-00-00-00-E0
   DHCP włączone . . . . . . . . . . : Nie
   Autokonfiguracja włączona . . . . : Tak
   Adres IPv6. . . . . . . . . . . . : 2001:0:5ef5:79fd:3051:3d9a:6032:9e97(Pref
erowane)
   Adres IPv6 połączenia lokalnego . : fe80::3051:3d9a:6032:9e97%13(Preferowane)

   Brama domyślna. . . . . . . . . . : ::
   NetBIOS przez Tcpip . . . . . . . : Wyłączony

Co więcej testowałem teraz z poziomu emulatora i wszystko działa, server otrzymuje dane. Lecz kiedy chcę to zrobić z poziomu telefonu to nic się nie dzieje. Do testów używam 2 niezależnych telefonów jeden z wersją 4.1.1 a drug 2.3.6 androida. Na obu po wciśnięciu przycisku, server nie otrzymuje danych, pomimo podłączenia do sieci wifi.

Edit:
Problem ROZWIĄZANY a winnym okazał się ... antywirus i jego zapora sieciowa ;D Wystarczyło go wyłączyć a potem wprowadzić wyjątek i wszystko działa.
Dzięki Napsteer za pomoc i poświęcony mi czas, jak widać problem okazał się banalny ;)

Temat do zamknięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1