Android: połączenie internetowe w tle nie chce się łączyć

0

Witam. Piszę małą aplikacje na androida której zadaniem jest wysyłanie pewnych informacji na serwer. Niestety aplikacja nie chce się połączyć poprawnie. Serwer testowałem z wykorzystaniem zwykłych javo'wych aplikacji jednak gdy przeniosłem jej ciało (klienta) do androida jemu się to nie spodobało.

package com.example.spr;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

import com.google.android.gms.wallet.LoyaltyWalletObject;

import android.app.Activity;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class RejestracjaActivity extends Activity {

	Uzytkownik user = new Uzytkownik(null, null, null, false, null, null, null, 0);
	ProgressBar pb;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_rejestracja);
		pb=(ProgressBar) findViewById(R.id.progressBar1);
		pb.setVisibility(ProgressBar.INVISIBLE);
	}
	private boolean czyPusty(EditText edit) {
		if(edit.equals(null))
			return false;
		else
			return true;
		
	}

	public void rejestrujListener(View view) { 
		
		final EditText ImieText = (EditText) findViewById(R.id.Imie);
		String Imie = ImieText.getText().toString();
		
		final EditText NazwiskoText = (EditText) findViewById(R.id.Nazwisko);
		String Nazwisko = NazwiskoText.getText().toString();
		
		final EditText MiastoText = (EditText) findViewById(R.id.Miasto);
		String Miasto = MiastoText.getText().toString();
		
		final EditText LoginText = (EditText) findViewById(R.id.Login);
		String Login = LoginText.getText().toString();
		
		final EditText HasloText = (EditText) findViewById(R.id.Haslo);
		String Haslo = HasloText.getText().toString();
		
		final EditText Haslo2Text = (EditText) findViewById(R.id.Haslo2);
		String Haslo2 = Haslo2Text.getText().toString();
		
		final CheckBox checkBox = (CheckBox) findViewById(R.id.Typ);
		
		final TextView errorText = (TextView) findViewById(R.id.textError);
		
		final TextView iTex = (TextView) findViewById(R.id.TextImie);
		final TextView nTex = (TextView) findViewById(R.id.TextNazwisko);
		final TextView mTex = (TextView) findViewById(R.id.TextMiasto);
		final TextView lTex = (TextView) findViewById(R.id.TextLogin);
		final TextView hTex = (TextView) findViewById(R.id.TextHaslo);
		final TextView h2Tex = (TextView) findViewById(R.id.TextHaslo2);
		String temp;
		
		
		
		if(czyPusty(ImieText))
		{
			errorText.setTextColor(Color.RED);
			errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
			temp = iTex.getText().toString();
			temp += "*";
			iTex.setText(temp);
		}
		else{
			iTex.setText("Imie:");
			user.imie=Imie;
		}
		
		if(czyPusty(NazwiskoText))
		{
			errorText.setTextColor(Color.RED);
			errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
			temp = nTex.getText().toString();
			temp += "*";
			nTex.setText(temp);
		}
		else{ 
			nTex.setText("Nazwisko:");
			user.nazwisko=Nazwisko;
		}
		if(czyPusty(MiastoText)){
			errorText.setTextColor(Color.RED);
			errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
			temp = mTex.getText().toString();
			temp += "*";
			mTex.setText(temp);
		}
		else{
			mTex.setText("Miasto:");
			user.miasto=Miasto;
		}
		if (checkBox.isChecked()){
            user.typ_konta=true;}
		else{
			user.typ_konta=false;}
		if (czyPusty(LoginText)){
			errorText.setTextColor(Color.RED);
			errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
			temp = lTex.getText().toString();
			temp += "*";
			lTex.setText(temp);
		}
		else{
			lTex.setText("Login:");
			user.login=Login;
		}
		if(czyPusty(HasloText)){
			temp = hTex.getText().toString();
			temp += "*";
			hTex.setText(temp);
		}
		else{
			hTex.setText("Haslo:");
		}
		if(czyPusty(Haslo2Text)){
			temp = h2Tex.getText().toString();
			temp += "*";
			h2Tex.setText(temp);
		}
		else{
			h2Tex.setText("Powtórz hasło:");
		}
		if((czyPusty(HasloText))&&(czyPusty(Haslo2Text))){
			if ((!Haslo.equals(Haslo2)))
			{
				errorText.setTextColor(Color.RED);
				errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
				temp = hTex.getText().toString();
				temp += "*";
				hTex.setText(temp);
				temp = h2Tex.getText().toString();
				temp += "*";
				h2Tex.setText(temp);
			}
			else
			{
				user.haslo=Haslo;
				h2Tex.setText("Powtórz hasło:");
				hTex.setText("Haslo:");
			}
			
		}
		user.ostrzezenia=0;
		user.lokalizacja="0,0";
		if((czyPusty(ImieText))&&(czyPusty(NazwiskoText))&&(czyPusty(MiastoText))&&(checkBox.isChecked())&&(czyPusty(LoginText))&&(czyPusty(HasloText))&&(czyPusty(Haslo2Text))&&(Haslo.equals(Haslo2)))
		{
			errorText.setText(null);
			new watekRejestracji().execute();
			
		}

	}
	
	private class watekRejestracji extends AsyncTask<Void, Void, Void>{
		private static final int PORT = 9512;  
	    private static final String HOST = "95.49.168.205";  
	    ObjectOutputStream out  = null;
		@Override
		protected void onPreExecute(){
			pb.setVisibility(ProgressBar.VISIBLE);
		}
		@Override
		protected Void doInBackground(Void... params) {

			        try  
			        {  
			        	Socket socket = new Socket(HOST, PORT);
						//System.out.println("Polaczono");
				        OutputStream outStream = socket.getOutputStream();
				        out = new ObjectOutputStream(outStream); 
				        //System.out.println("utworzono strumienie");
				    	Uzytkownik user = new Uzytkownik("Jan","Nowak","Siedlce",true,"JaNo","123","Wyszka",0);
						MsgPack msg = new MsgPack(true, 1, 2, true, "krwotok", true, user);
						//System.out.println("wysyla");
						out.writeObject(msg);
						//System.out.println("wyslano");
				        //System.out.println("zamykam");
				        out.close();  
				        socket.close(); 
			        }  
			        catch(Exception e)  
			        {  
			        	Toast.makeText(getApplicationContext(),
		                        "Coś sie zjebalo", Toast.LENGTH_SHORT)
		                        .show();
			        }
					return null;  
		}

		@Override
		protected void onPostExecute(Void result){
			pb.setVisibility(ProgressBar.INVISIBLE);
		}

	
		
		
		
	}
}

 

Ta aktywność ma odpowiadać za wysłanie danych o rejestracji użytkownika na serwer. Wiem, że walidacja (o ile można to już tak nazwać) jest jeszcze szczątkowa ale to później. Obiekt na razie jak widać tworze na sztywno. Później będę go przekazywał.

Kod błędu:

 11-19 13:15:17.189: D/dalvikvm(30256): GC_EXTERNAL_ALLOC freed 75K, 49% free 2770K/5379K, external 0K/0K, paused 68ms
11-19 13:15:28.179: D/dalvikvm(30256): GC_CONCURRENT freed 225K, 50% free 2871K/5639K, external 142K/512K, paused 10ms+4ms
11-19 13:15:52.639: W/dalvikvm(30256): threadid=10: thread exiting with uncaught exception (group=0x40018560)
11-19 13:15:52.659: E/AndroidRuntime(30256): FATAL EXCEPTION: AsyncTask #1
11-19 13:15:52.659: E/AndroidRuntime(30256): java.lang.RuntimeException: An error occured while executing doInBackground()
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at android.os.AsyncTask$3.done(AsyncTask.java:200)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at java.lang.Thread.run(Thread.java:1019)
11-19 13:15:52.659: E/AndroidRuntime(30256): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at android.os.Handler.<init>(Handler.java:121)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at android.widget.Toast.<init>(Toast.java:68)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at android.widget.Toast.makeText(Toast.java:231)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at com.example.spr.RejestracjaActivity$watekRejestracji.doInBackground(RejestracjaActivity.java:203)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at com.example.spr.RejestracjaActivity$watekRejestracji.doInBackground(RejestracjaActivity.java:1)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at android.os.AsyncTask$2.call(AsyncTask.java:185)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
11-19 13:15:52.659: E/AndroidRuntime(30256): 	... 4 more
0

Wywal Toast z try catch w AsyncTask

0

Trochę edytowałem ten kod:

 package com.example.spr;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

import com.google.android.gms.wallet.LoyaltyWalletObject;

import android.app.Activity;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class RejestracjaActivity extends Activity {

	Uzytkownik user = new Uzytkownik(null, null, null, false, null, null, null, 0);
	ProgressBar pb;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_rejestracja);
		pb=(ProgressBar) findViewById(R.id.progressBar1);
		pb.setVisibility(ProgressBar.INVISIBLE);
	}


	public void rejestrujListener(View view) { 
		
		final EditText ImieText = (EditText) findViewById(R.id.Imie);
		String Imie = ImieText.getText().toString();
		
		final EditText NazwiskoText = (EditText) findViewById(R.id.Nazwisko);
		String Nazwisko = NazwiskoText.getText().toString();
		
		final EditText MiastoText = (EditText) findViewById(R.id.Miasto);
		String Miasto = MiastoText.getText().toString();
		
		final EditText LoginText = (EditText) findViewById(R.id.Login);
		String Login = LoginText.getText().toString();
		
		final EditText HasloText = (EditText) findViewById(R.id.Haslo);
		String Haslo = HasloText.getText().toString();
		
		final EditText Haslo2Text = (EditText) findViewById(R.id.Haslo2);
		String Haslo2 = Haslo2Text.getText().toString();
		
		final CheckBox checkBox = (CheckBox) findViewById(R.id.Typ);
		
		final TextView errorText = (TextView) findViewById(R.id.textError);
		
		final TextView iTex = (TextView) findViewById(R.id.TextImie);
		final TextView nTex = (TextView) findViewById(R.id.TextNazwisko);
		final TextView mTex = (TextView) findViewById(R.id.TextMiasto);
		final TextView lTex = (TextView) findViewById(R.id.TextLogin);
		final TextView hTex = (TextView) findViewById(R.id.TextHaslo);
		final TextView h2Tex = (TextView) findViewById(R.id.TextHaslo2);
		String temp;
		boolean isOK = true;
		
		
		
		if(Imie.length()<=0)
		{
			errorText.setTextColor(Color.RED);
			errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
			temp = iTex.getText().toString();
			temp += "*";
			iTex.setText(temp);
			isOK = false ;
		}
		else{
			iTex.setText("Imie:");
			user.imie=Imie;
		}
		
		if(Nazwisko.length()<=0)
		{
			errorText.setTextColor(Color.RED);
			errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
			temp = nTex.getText().toString();
			temp += "*";
			nTex.setText(temp);
			isOK = false ;
		}
		else{ 
			nTex.setText("Nazwisko:");
			user.nazwisko=Nazwisko;
		}
		if(Miasto.length()<=0){
			errorText.setTextColor(Color.RED);
			errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
			temp = mTex.getText().toString();
			temp += "*";
			isOK = false ;
			mTex.setText(temp);
		}
		else{
			mTex.setText("Miasto:");
			user.miasto=Miasto;
		}
		if (checkBox.isChecked()){
            user.typ_konta=true;}
		else{
			user.typ_konta=false;}
		if (Login.length()<=0){
			errorText.setTextColor(Color.RED);
			errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
			temp = lTex.getText().toString();
			temp += "*";
			lTex.setText(temp);
			isOK = false ;
		}
		else{
			lTex.setText("Login:");
			user.login=Login;
		}
		if(Haslo.length()<=0){
			temp = hTex.getText().toString();
			temp += "*";
			hTex.setText(temp);
			isOK = false ;
		}
		else{
			hTex.setText("Haslo:");
		}
		if(Haslo2.length()<=0){
			temp = h2Tex.getText().toString();
			temp += "*";
			h2Tex.setText(temp);
			isOK = false ;
		}
		else{
			h2Tex.setText("Powtórz hasło:");
		}
		/*if((Haslo.length()<=0)&&(Haslo2.length()<=0)){
			if ((!Haslo.equals(Haslo2)))
			{
				errorText.setTextColor(Color.RED);
				errorText.setText("Sprawdz pola zaznaczone gwiazdką *");
				temp = hTex.getText().toString();
				temp += "*";
				hTex.setText(temp);
				temp = h2Tex.getText().toString();
				temp += "*";
				h2Tex.setText(temp);
			}
			else
			{
				user.haslo=Haslo;
				h2Tex.setText("Powtórz hasło:");
				hTex.setText("Haslo:");
			}
			
		}*/
		user.ostrzezenia=0;
		user.lokalizacja="0,0";
		if(isOK)
		{
			errorText.setTextColor(Color.BLACK);
			errorText.setText("Dane poprawne");
			new watekRejestracji().execute();
			
		}

	}
	
	private class watekRejestracji extends AsyncTask<Void, Void, Void>{
		private static final int PORT = 9512;  
	    private static final String HOST = "95.49.168.205";  
	    ObjectOutputStream out  = null;
		@Override
		protected void onPreExecute(){
			pb.setVisibility(ProgressBar.VISIBLE);
		}
		@Override
		protected Void doInBackground(Void... params) {

			        try  
			        {  
			        	Socket socket = new Socket(HOST, PORT);
						System.out.println("Polaczono");
				        OutputStream outStream = socket.getOutputStream();
				        out = new ObjectOutputStream(outStream); 
				        System.out.println("utworzono strumienie");
				    	Uzytkownik user = new Uzytkownik("Jan","Nowak","Siedlce",true,"JaNo","123","Wyszka",0);
						MsgPack msg = new MsgPack(true, 1, 2, true, "krwotok", true, user);
						System.out.println("wysyla");
						out.writeObject(msg);
						System.out.println("wyslano");
				        System.out.println("zamykam");
				        out.close();  
				        socket.close(); 
			        }  
			        catch(Exception e)  
			        {  
			        	System.out.println("Pojebało");
			        }
					return null;  
		}

		@Override
		protected void onPostExecute(Void result){
			pb.setVisibility(ProgressBar.INVISIBLE);
		}

	
		
		
		
	}
}

Log jednak nadal pokazuje błąd (pojebalo)

11-19 21:06:13.529: D/dalvikvm(3657): GC_EXTERNAL_ALLOC freed 71K, 49% free 2769K/5379K, external 0K/0K, paused 119ms
11-19 21:06:19.139: I/System.out(3657): Pojeba這
11-19 21:06:26.489: D/dalvikvm(3657): GC_CONCURRENT freed 175K, 49% free 2918K/5639K, external 142K/512K, paused 9ms+20ms
11-19 21:07:18.869: W/KeyCharacterMap(3657): No keyboard for id 0
11-19 21:07:18.879: W/KeyCharacterMap(3657): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-19 21:07:28.739: D/dalvikvm(3657): GC_CONCURRENT freed 405K, 51% free 2943K/5895K, external 142K/512K, paused 3ms+6ms
11-19 21:09:40.169: W/KeyCharacterMap(3657): No keyboard for id 0
11-19 21:09:40.169: W/KeyCharacterMap(3657): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-19 21:09:47.499: I/dalvikvm(3657): Jit: resizing JitTable from 512 to 1024
11-19 21:10:47.319: W/KeyCharacterMap(3657): Can't open keycharmap file
11-19 21:10:47.329: W/KeyCharacterMap(3657): Error loading keycharmap file '/system/usr/keychars/sec_touchscreen.kcm.bin'. hw.keyboards.65537.devname='sec_touchscreen'
11-19 21:10:47.329: W/KeyCharacterMap(3657): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-19 21:10:47.579: W/IInputConnectionWrapper(3657): showStatusIcon on inactive InputConnection
11-19 21:10:49.139: D/dalvikvm(3657): Debugger has detached; object registry had 1 entries
11-19 21:12:54.249: D/dalvikvm(3954): GC_EXTERNAL_ALLOC freed 72K, 49% free 2769K/5379K, external 0K/0K, paused 57ms
11-19 21:13:17.899: I/System.out(3954): Pojeba這
11-19 21:13:24.619: D/dalvikvm(3954): GC_CONCURRENT freed 176K, 49% free 2923K/5639K, external 142K/512K, paused 9ms+19ms
11-19 21:15:34.259: W/KeyCharacterMap(3954): Can't open keycharmap file
11-19 21:15:34.259: W/KeyCharacterMap(3954): Error loading keycharmap file '/system/usr/keychars/sec_touchscreen.kcm.bin'. hw.keyboards.65537.devname='sec_touchscreen'
11-19 21:15:34.259: W/KeyCharacterMap(3954): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-19 21:15:34.349: W/IInputConnectionWrapper(3954): showStatusIcon on inactive InputConnection
11-19 21:17:43.389: D/dalvikvm(4131): GC_EXTERNAL_ALLOC freed 79K, 49% free 2769K/5379K, external 0K/0K, paused 264ms
11-19 21:17:44.299: W/IInputConnectionWrapper(4131): showStatusIcon on inactive InputConnection
11-19 21:17:52.979: D/dalvikvm(4131): GC_CONCURRENT freed 181K, 49% free 2916K/5639K, external 142K/512K, paused 7ms+38ms
11-19 21:18:01.909: I/System.out(4131): Pojeba這
11-19 21:20:16.299: W/KeyCharacterMap(4131): Can't open keycharmap file
11-19 21:20:16.299: W/KeyCharacterMap(4131): Error loading keycharmap file '/system/usr/keychars/sec_touchscreen.kcm.bin'. hw.keyboards.65537.devname='sec_touchscreen'
11-19 21:20:16.299: W/KeyCharacterMap(4131): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-19 21:20:17.839: W/IInputConnectionWrapper(4131): showStatusIcon on inactive InputConnection
11-19 21:20:48.779: D/dalvikvm(4131): GC_CONCURRENT freed 356K, 50% free 2991K/5895K, external 142K/512K, paused 21ms+14ms
11-19 21:21:19.659: I/System.out(4131): Pojeba這
 

Internet w tel jest włączony.

W manifescie uprawnienia też są:

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

Log pokazuje że nie mógł połączyć się z serwerem(przejście do catch 'pomerdało') (spróbuj HttpClinet, HttpPost).
Log pokazuje brak mapy znaków. Odpalasz to może na AVD ?

0

Witaj. Odpalam na telefonie. W tym rzecz, że wolałbym żeby zadziałało to na socet'cie

0

No to na bank masz źle postawione połączenie przez Socket.
A w logu widać że coś z klawiaturą nie tak

0

Nazwy klas zaczynamy wielką literą. Nie mieszamy języka polskiego z angielskim. Popraw kod, jest dużo powtórzeń i wygląda to bardzo niedobrze. Tego "pomerdało" nawet nie mam ochoty komentować, użyj e.printStackTrace() w bloku catch aby dowiedzieć się co powoduje błąd.

0

Witam. Wielkie dzięki za porady stylistyczne, na pewno spróbuje to poprawić;). Masz racje z tym "pomerdało" nie wykazałem się klasą(to owoc frustracji).
Po Twojej radzie logi prezentują się następująco:

 11-19 21:47:20.519: D/dalvikvm(4931): GC_EXTERNAL_ALLOC freed 80K, 49% free 2769K/5379K, external 0K/0K, paused 83ms
11-19 21:47:33.039: D/dalvikvm(4931): GC_CONCURRENT freed 228K, 50% free 2862K/5639K, external 142K/512K, paused 10ms+11ms
11-19 21:47:59.929: W/System.err(4931): java.net.SocketTimeoutException: Connection timed out
11-19 21:47:59.989: W/System.err(4931): 	at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
11-19 21:47:59.989: W/System.err(4931): 	at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357)
11-19 21:47:59.999: W/System.err(4931): 	at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
11-19 21:47:59.999: W/System.err(4931): 	at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
11-19 21:47:59.999: W/System.err(4931): 	at java.net.Socket.startupSocket(Socket.java:705)
11-19 21:47:59.999: W/System.err(4931): 	at java.net.Socket.tryAllAddresses(Socket.java:150)
11-19 21:47:59.999: W/System.err(4931): 	at java.net.Socket.<init>(Socket.java:209)
11-19 21:47:59.999: W/System.err(4931): 	at java.net.Socket.<init>(Socket.java:176)
11-19 21:48:00.009: W/System.err(4931): 	at com.example.spr.RejestracjaActivity$WatekRejestracji.doInBackground(RejestracjaActivity.java:191)
11-19 21:48:00.009: W/System.err(4931): 	at com.example.spr.RejestracjaActivity$WatekRejestracji.doInBackground(RejestracjaActivity.java:1)
11-19 21:48:00.009: W/System.err(4931): 	at android.os.AsyncTask$2.call(AsyncTask.java:185)
11-19 21:48:00.009: W/System.err(4931): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
11-19 21:48:00.009: W/System.err(4931): 	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
11-19 21:48:00.009: W/System.err(4931): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
11-19 21:48:00.009: W/System.err(4931): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
11-19 21:48:00.009: W/System.err(4931): 	at java.lang.Thread.run(Thread.java:1019)

Wiem co może być problem. Gdy ostatnio sprawdzałem swoje ip (strony typu: http://www.moje-ip.eu/ ) było inne niż dziś. Serwerek stoi na moim laptopie, a po drodze jest router. Co o tym myślicie? Jak mogę to rozwiązać?

0

Apka dostałą Timeout'a.
Stawiam że nie dostałeś się do serwera, bo brak loginu i hasła lub serwera nie ma takiego.

Polecam ten artykuł:
http://examples.javacodegeeks.com/android/core/socket-core/android-socket-example/

0

hmm.. Udało się połączyć. Problemem było tak jak podejrzewałem nie odpowiednie ip. Podłączyłem tel do sieci lokalnej i zaczęły się komunikować.

Jest nowy problem klient na androidzie wysyła paczkę(object) z danymi.

 protected Void doInBackground(Void... params) {

			        try  
			        {  
			        	socket = new Socket(HOST, PORT);
						System.out.println("Polaczono");
				        OutputStream outStream = socket.getOutputStream();
				        out = new ObjectOutputStream(outStream); 
				        System.out.println("utworzono strumienie");
				    	Uzytkownik user2 = new Uzytkownik("Jan","Nowak","Siedlce",true,"JaNo","123","Wyszka",0);
						MsgPack msg = new MsgPack(true, 1, 2, true, "krwotok", true, user2);
						System.out.println("wysyla");
						out.writeObject(msg);
						if(msg.czyLokalizacja){System.out.println("lok");};
						System.out.println("wyslano");
				        System.out.println("zamykam");
				        out.close();  
				        socket.close(); 
			        }  
			        catch(Exception e)  
			        {  
			        	e.printStackTrace();
			        }
					return null;  
		}

log:

11-20 00:06:44.369: W/KeyCharacterMap(8117): Can't open keycharmap file
11-20 00:06:44.369: W/KeyCharacterMap(8117): Error loading keycharmap file '/system/usr/keychars/sec_touchscreen.kcm.bin'. hw.keyboards.65537.devname='sec_touchscreen'
11-20 00:06:44.369: W/KeyCharacterMap(8117): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-20 00:06:45.169: W/IInputConnectionWrapper(8117): showStatusIcon on inactive InputConnection
11-20 00:07:03.609: D/dalvikvm(8117): GC_CONCURRENT freed 448K, 51% free 2969K/5959K, external 142K/512K, paused 9ms+5ms
11-20 00:07:07.409: I/System.out(8117): Polaczono
11-20 00:07:07.419: I/System.out(8117): utworzono strumienie
11-20 00:07:07.419: I/System.out(8117): wysyla
11-20 00:07:07.419: I/dalvikvm(8117): Jit: resizing JitTable from 512 to 1024
11-20 00:07:07.439: I/System.out(8117): lok
11-20 00:07:07.439: I/System.out(8117): wyslano
11-20 00:07:07.439: I/System.out(8117): zamykam 

serwer:

public static void main(String[] args) throws IOException  
    {  
		int portNumber = 6000 ; 

		ServerSocket server = null;

		//public Vector<New_Client> vec = new Vector<New_Client>();

		System.out.println ("Serwer uruchomiony");

		while(true)
		{
			try {
				server = new ServerSocket(portNumber);
				Socket klientSocket = server.accept();
				System.out.println("Nowy klient");
				InputStream inStream = klientSocket.getInputStream();
				OutputStream outStream = klientSocket.getOutputStream();
				ObjectInputStream in = new ObjectInputStream(inStream);
				ObjectOutputStream out = new ObjectOutputStream(outStream);
				try {
					////////////////////////////
					Object o = (Object) in.readObject();
					if(in.equals(null)){
						System.out.println("pusto");
					}
					else System.out.println("cos jest");
					////////////////////////////
					if (((MsgPack) o).czyLokalizacja ) {
						System.out.print("Lokalizacja");

					
					}
					else { 
						System.out.println("nie Lokalizacja");
					}
					if(((MsgPack) o).czyRejestracja){
						System.out.println("Rejestracja");
					}
					else{
						System.out.println("nie Rejestracja");
					}
					if(((MsgPack)o).czyZgloszenie){
						//InetAddress ip = socket.getInetAddress();
						System.out.println("Zgloszenie");
					}
					else{
						System.out.println("nie Zgloszenie");
					}

				}catch (ClassNotFoundException e) {
					System.out.println("error");
					e.printStackTrace();
					System.out.println(e);
				} catch (NullPointerException npe) {
					
				}
			} catch (IOException ioe) {
				
				Thread.currentThread().interrupt();
			}
			//server.close();
		}

		}
	
} 

Oczywiście warunki to tylko szkielet do dalszej obróbki.

Konsola:

Serwer uruchomiony
Nowy klient
error
java.lang.ClassNotFoundException: com.example.spr.MsgPack
java.lang.ClassNotFoundException: com.example.spr.MsgPack
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at java.io.ObjectInputStream.resolveClass(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at MojServer.main(MojServer.java:38) 

Czy dobrze rozumiem ze serwer krzyczy że nie może znaleźć klasy: com.example.spr.MsgPack
Zarówno w package apki z serwerem jak i tej na androida klasa ta się znajduje.

0

Widzę, że nie przeczytałeś artykułu który Ci podesłałem.
Serwer powinien pracować na nowych wątkach.

0

Więc to nie jest problem. Czy ktoś z Was ma pomysł jak mógłbym rozwiązać ten problem?

0

wypisuj zawsze stackTrace błędu bo tak to ciężko powiedzieć co jest przyczyną błędu....

0

@panryz Czy w przypadku gdy serwer jest oddzielną aplikacją nie działającą na Androidzie też jest to konieczne?

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;


/**
 * Wątek tworzący gniazdo serwera oraz oczekujący na nowych klientów. 
 */

public class MojServer
{

	public static void main(String[] args) throws IOException  
    {  
		final int portNumber = 6000 ; 

		//final ServerSocket server = null;

		//public Vector<New_Client> vec = new Vector<New_Client>();

		System.out.println ("Serwer uruchomiony");

			try {
				ServerSocket server = new ServerSocket(portNumber);
				Socket klientSocket = server.accept();
				System.out.println("Nowy klient");
				
				InputStream inStream = klientSocket.getInputStream();
				OutputStream outStream = klientSocket.getOutputStream();
				ObjectInputStream in = new ObjectInputStream(inStream);
				ObjectOutputStream out = new ObjectOutputStream(outStream);
				try {
					////////////////////////////
					//Object o = (Object) in.readObject();
					MsgPack msg = (MsgPack)in.readObject();
					if(in.equals(null)){
						System.out.println("pusto");
					}
					else System.out.println("cos jest");
					////////////////////////////
					if (msg.czyLokalizacja ) {
						System.out.print("Lokalizacja");

					
					}
					else { 
						System.out.println("nie Lokalizacja");
					}
					

				}catch (ClassNotFoundException e) {
					System.out.println("ClassNotFoundException");
					e.printStackTrace();
				} catch (NullPointerException npe) {
					System.out.println("NullPointerException");
					npe.printStackTrace();
				}
			} catch (IOException ioe) {
				System.out.println("IOException");
				ioe.printStackTrace();
				Thread.currentThread().interrupt();
			}
			//server.close();
		}    
    }

 

Kod po zmianach

a tu mamy wypisane bledy:

Serwer uruchomiony
Nowy klient
ClassNotFoundException
java.lang.ClassNotFoundException: com.example.spr.MsgPack
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at java.io.ObjectInputStream.resolveClass(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at MojServer.main(MojServer.java:37)
 
0

nie masz importu klasy MsgPack to skąd ma wiedzieć co to to jest,jeżeli jest w tej samej paczce to okey.

Jeszcze pytanie czy masz zserializowane to cudo MsgPack,bo przy błędach serializacji wywala taki błąd zgodnie z dokumentacją https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

poka definicje klasy

0
 
import java.io.Serializable;

public class MsgPack implements Serializable {
	public boolean czyLokalizacja; 
	public double latitude ;
	public double longitude ;
	public boolean czyZgloszenie;
	public String zdarzenie;
	public boolean czyRejestracja;
	Uzytkownik uzytkownik;
	

	

	public MsgPack( boolean czyLok, double lat, double lon, boolean czyZglo, String zda, boolean czyRej, Uzytkownik user){
		czyLokalizacja = czyLok;
		czyZgloszenie = czyZglo;
		czyRejestracja = czyRej;
		
		if(czyLok){
			latitude = lat;
			longitude = lon;
		}
		if(czyZglo){
			zdarzenie = zda;
		}
		if(czyRej){
			uzytkownik = user;
		}

		
	}
} 

Oczywiście klasa ta znajduję się zarówno w paczce aplikacji na androida jak i w paczce serwera.

0

a ten użytkownik? tyż zserializowany ?

0

Tak. Jedyna różnica jest taka że klasa znajdujące się w paczce wymaga jawnego podania tego że tam jest (package com.example.spr;), jeżeli to usune z którejś klasy (czy to uzytkownik czy MsgPack) to wywala błąd. Natomiast klasy te w paczce z serwerem nie posiadają takiego wpisu (paczka domyslna).

Dodam jeszcze, że gdy testowałem to na zwykłej aplikacji klienckiej(nie androidowej) to wszystko działało.

0

Ewidentnie jest błąd z deserializacją klasy MsgPack. Debugerem sprawdzałeś co jest przyjmowane w ty inStream ?

0

Ten kod jest straszny nawet jeśli przymknę oko na idiotyczne komunikaty. :/

Kilka słów kluczowych na początek:

  • Clean Code
  • Retrofit
  • OkHttp
  • RxJava (to na potem)

Jak już koniecznie chcesz używać tego AsyncTaska i wywoływać w nim jakieś operacje w UI, to użyj metody runOnUiThread().

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