Сервер с несколькими клиентами Android

1
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import java.io.*;
import java.net.*;

public class MainActivity extends Activity implements Runnable {

    TextView tview;
    BufferedReader in;
    Socket socket;
    private LocationManager lm;
    private LocationListener locationListener;

    Thread thread = new Thread();
    /** Called when the activity is first created. */
    @Override
    public void run()
    {
        try
        {
            socket = new Socket("10.0.2.2", 1234);
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            out.println("Connection Established");

        }
        catch (Exception e)
        { 
            tview.setText(e.toString());
        }

        try 
        { 
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        }
        catch (Exception e)
        { 
            tview.setText(e.toString());
        }

        try
        {
            String line = in.readLine();
        } 
        catch (IOException e) 
        {
             System.exit(-1);
        }
    }

    public void onCreate(Bundle savedInstanceState) {

        thread.start();

        tview = new TextView(this);    


        setContentView(tview);
        super.onCreate(savedInstanceState);

        lm = (LocationManager) 
        getSystemService(Context.LOCATION_SERVICE);    

        locationListener = new MyLocationListener();

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);  



    }

    private class MyLocationListener implements LocationListener 
    {
        @Override
        public void onLocationChanged(Location loc) {

        if (loc != null) {

                PrintWriter out;

                try 
                {
                    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

                    out.println("Location~"+loc.getLongitude()+"~"+loc.getLatitude());//change this with location!!!!!!!!
                }
                catch (IOException e)
                {

                    e.printStackTrace();
                }

                Toast.makeText(getBaseContext()," Locationchanged : Lat: " + loc.getLatitude() + 
                    " Lng:  " + loc.getLongitude(), 
                    Toast.LENGTH_SHORT).show();

                try
                {
                    String line = in.readLine();
                } 
                catch (Exception e)
                {
                    System.out.println("reading  failed");
                }

            }
        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onStatusChanged(String provider, int status, 
            Bundle extras) {
            // TODO Auto-generated method stub
        }
    }        


}

Лог кот:

    04-13 13:09:52.303: DEBUG/dalvikvm(425): GC freed 43 objects / 1960 bytes in 155ms
04-13 13:22:34.983: DEBUG/AndroidRuntime(691): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
04-13 13:22:34.994: DEBUG/AndroidRuntime(691): CheckJNI is ON
04-13 13:22:35.353: DEBUG/AndroidRuntime(691): --- registering native functions ---
04-13 13:22:35.413: INFO/jdwp(691): Ignoring second debugger -- accepting and dropping
04-13 13:22:35.422: INFO/jdwp(691): Ignoring second debugger -- accepting and dropping
04-13 13:22:35.943: DEBUG/ddm-heap(691): Got feature list request
04-13 13:22:36.593: DEBUG/PackageParser(275): Scanning package: /data/app/vmdl34515.tmp
04-13 13:22:36.723: INFO/PackageManager(275): Removing non-system package:com.servertest
04-13 13:22:36.734: DEBUG/PackageManager(275): Removing package com.servertest
04-13 13:22:36.744: DEBUG/PackageManager(275):   Activities: com.servertest.MainActivity
04-13 13:22:36.883: DEBUG/PackageManager(275): Scanning package com.servertest
04-13 13:22:36.892: INFO/PackageManager(275): /data/app/vmdl34515.tmp changed; unpacking
04-13 13:22:36.913: DEBUG/installd(32): DexInv: --- BEGIN '/data/app/vmdl34515.tmp' ---
04-13 13:22:37.242: DEBUG/dalvikvm(697): DexOpt: load 53ms, verify 86ms, opt 2ms
04-13 13:22:37.272: DEBUG/installd(32): DexInv: --- END '/data/app/vmdl34515.tmp' (success) ---
04-13 13:22:37.282: DEBUG/PackageManager(275):   Activities: com.servertest.MainActivity
04-13 13:22:37.293: DEBUG/ActivityManager(275): Uninstalling process com.servertest
04-13 13:22:37.432: INFO/installd(32): move /data/dalvik-cache/data@[email protected]@classes.dex -> /data/dalvik-cache/data@[email protected]@classes.dex
04-13 13:22:37.453: DEBUG/PackageManager(275): New package installed in /data/app/com.servertest.apk
04-13 13:22:37.602: DEBUG/AndroidRuntime(691): Shutting down VM
04-13 13:22:37.612: DEBUG/dalvikvm(691): DestroyJavaVM waiting for non-daemon threads to exit
04-13 13:22:37.633: DEBUG/dalvikvm(691): DestroyJavaVM shutting VM down
04-13 13:22:37.633: DEBUG/dalvikvm(691): HeapWorker thread shutting down
04-13 13:22:37.643: DEBUG/dalvikvm(691): HeapWorker thread has shut down
04-13 13:22:37.643: DEBUG/jdwp(691): JDWP shutting down net...
04-13 13:22:37.653: INFO/dalvikvm(691): Debugger has detached; object registry had 1 entries
04-13 13:22:37.663: DEBUG/dalvikvm(691): VM cleaning up
04-13 13:22:37.682: ERROR/AndroidRuntime(691): ERROR: thread attach failed
04-13 13:22:37.713: DEBUG/ActivityManager(275): Uninstalling process com.servertest
04-13 13:22:37.763: DEBUG/dalvikvm(691): LinearAlloc 0x0 used 623916 of 5242880 (11%)
04-13 13:22:37.993: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f0700e5
04-13 13:22:38.033: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f020031
04-13 13:22:38.033: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f020030
04-13 13:22:38.044: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f050000
04-13 13:22:38.253: DEBUG/dalvikvm(322): GC freed 2620 objects / 147200 bytes in 287ms
04-13 13:22:38.343: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f060000
04-13 13:22:38.443: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f060001
04-13 13:22:38.554: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f0700e5
04-13 13:22:38.573: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f020031
04-13 13:22:38.573: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f020030
04-13 13:22:38.573: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f050000
04-13 13:22:38.593: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f060000
04-13 13:22:38.613: WARN/ResourceType(275): Resources don't contain package for resource number 0x7f060001
04-13 13:22:39.083: DEBUG/dalvikvm(275): GC freed 13508 objects / 833920 bytes in 393ms
04-13 13:22:40.073: DEBUG/AndroidRuntime(702): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
04-13 13:22:40.093: DEBUG/AndroidRuntime(702): CheckJNI is ON
04-13 13:22:40.683: DEBUG/AndroidRuntime(702): --- registering native functions ---
04-13 13:22:40.733: INFO/jdwp(702): Ignoring second debugger -- accepting and dropping
04-13 13:22:41.233: INFO/jdwp(702): Ignoring second debugger -- accepting and dropping
04-13 13:22:41.243: DEBUG/ddm-heap(702): Got feature list request
04-13 13:22:41.983: INFO/ActivityManager(275): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.servertest/.MainActivity }
04-13 13:22:42.143: DEBUG/AndroidRuntime(702): Shutting down VM
04-13 13:22:42.143: DEBUG/dalvikvm(702): DestroyJavaVM waiting for non-daemon threads to exit
04-13 13:22:42.153: DEBUG/dalvikvm(702): DestroyJavaVM shutting VM down
04-13 13:22:42.153: DEBUG/dalvikvm(702): HeapWorker thread shutting down
04-13 13:22:42.163: DEBUG/dalvikvm(702): HeapWorker thread has shut down
04-13 13:22:42.163: DEBUG/jdwp(702): JDWP shutting down net...
04-13 13:22:42.163: INFO/dalvikvm(702): Debugger has detached; object registry had 1 entries
04-13 13:22:42.183: DEBUG/dalvikvm(702): VM cleaning up
04-13 13:22:42.223: INFO/ActivityManager(275): Start proc com.servertest for activity com.servertest/.MainActivity: pid=709 uid=10029 gids={3003}
04-13 13:22:42.233: ERROR/AndroidRuntime(702): ERROR: thread attach failed
04-13 13:22:42.333: DEBUG/dalvikvm(702): LinearAlloc 0x0 used 639500 of 5242880 (12%)
04-13 13:22:42.593: DEBUG/dalvikvm(270): GC freed 299 objects / 11584 bytes in 352ms
04-13 13:22:42.713: INFO/jdwp(709): Ignoring second debugger -- accepting and dropping
04-13 13:22:42.713: INFO/jdwp(709): Ignoring second debugger -- accepting and dropping
04-13 13:22:42.823: DEBUG/ddm-heap(709): Got feature list request
04-13 13:22:42.943: DEBUG/dalvikvm(270): GC freed 57 objects / 2432 bytes in 299ms
04-13 13:22:43.163: DEBUG/dalvikvm(270): GC freed 2 objects / 56 bytes in 215ms
04-13 13:22:43.613: DEBUG/LocationManager(709): Constructor: service = android.location.ILocationManager$Stub$Proxy@44e944b0
04-13 13:22:43.633: WARN/GpsLocationProvider(275): Duplicate add listener for uid 10029
04-13 13:22:43.643: DEBUG/GpsLocationProvider(275): setMinTime 0
04-13 13:22:43.643: DEBUG/GpsLocationProvider(275): startNavigating
04-13 13:22:44.003: INFO/ActivityManager(275): Displayed activity com.servertest/.MainActivity: 1884 ms (total 2046680 ms)
04-13 13:22:49.213: DEBUG/dalvikvm(322): GC freed 2508 objects / 143160 bytes in 115ms
04-13 13:22:54.343: DEBUG/dalvikvm(425): GC freed 80 objects / 3880 bytes in 171ms
04-13 13:23:02.119: DEBUG/GpsLocationProvider(275): TTFF: 18468
04-13 13:23:02.133: DEBUG/AndroidRuntime(709): Shutting down VM
04-13 13:23:02.143: WARN/dalvikvm(709): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
04-13 13:23:02.154: ERROR/AndroidRuntime(709): Uncaught handler: thread main exiting due to uncaught exception
04-13 13:23:02.183: ERROR/AndroidRuntime(709): java.lang.NullPointerException
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at com.servertest.MainActivity$MyLocationListener.onLocationChanged(MainActivity.java:93)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:179)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:112)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:128)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at android.os.Looper.loop(Looper.java:123)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at android.app.ActivityThread.main(ActivityThread.java:4363)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at java.lang.reflect.Method.invoke(Method.java:521)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-13 13:23:02.183: ERROR/AndroidRuntime(709):     at dalvik.system.NativeStart.main(Native Method)
04-13 13:23:02.205: INFO/Process(275): Sending signal. PID: 709 SIG: 3
04-13 13:23:02.223: INFO/dalvikvm(709): threadid=7: reacting to signal 3
04-13 13:23:02.253: INFO/dalvikvm(709): Wrote stack trace to '/data/anr/traces.txt'
04-13 13:23:05.785: INFO/Process(709): Sending signal. PID: 709 SIG: 9
04-13 13:23:05.833: INFO/ActivityManager(275): Process com.servertest (pid 709) has died.
04-13 13:23:05.843: WARN/GpsLocationProvider(275): Unneeded remove listener for uid 1000
04-13 13:23:05.843: DEBUG/GpsLocationProvider(275): stopNavigating
04-13 13:23:05.903: INFO/WindowManager(275): WIN DEATH: Window{44d4f370 com.servertest/com.servertest.MainActivity paused=false}
04-13 13:23:06.074: INFO/UsageStats(275): Unexpected resume of com.android.launcher while already resumed in com.servertest
04-13 13:23:06.153: WARN/InputManagerService(275): Got RemoteException sending setActive(false) notification to pid 709 uid 10029

Обновление:

У меня все еще возникают проблемы с записью с сервера клиентам. Пока связь - это только один путь - от клиента к серверу. Я не знаю, что я делаю неправильно, поскольку я много раз пытался добиться успеха. Любая помощь будет принята с благодарностью. Здесь мой код:

Класс сервера:

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

public class ServerClass implements Runnable {


   private int ID;
   public String line;

   PrintWriter out = null;
   private Socket connection;

     public static void main(String[] args)
     {

         int port = 1234;
         int count = 0;

         try
         {
             ServerSocket serverSocket = new ServerSocket(port);
             System.out.println("Server Initialized");
             while (true)
             {
                 Socket connection = serverSocket.accept();
                 Runnable runnable = new NewClass1(connection, ++count);
                 Thread thread = new Thread(runnable);
                 thread.start();
             }
         }
         catch (Exception e)
         {
             System.out.println("opening socket failed");
         }
     }




     ServerClass(Socket s, int i)
     {
         this.connection = s;
         this.ID=i;

     }

     public void run()
     {
         //String line;
         BufferedReader in = null;

         try
         {
            in=new BufferedReader(new InputStreamReader(connection.getInputStream()));
            out = new PrintWriter(connection.getOutputStream());
         }
         catch(Exception e)
         {
             System.out.println("Readers and Writers failed");
             System.exit(-1);
         }

         while(true)
         {
             try
             {
                 line = in.readLine();
                 out.println("Success");

                 System.out.println(line);

             }
             catch(Exception e)
             {
                 System.out.println("Failed");
             }
         }
     }
}

и активность Android:

package com.servertest;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import java.io.*;
import java.net.*;

public class MainActivity extends Activity {

    TextView tview;
    BufferedReader in;
    Socket socket;
    private LocationManager lm;
        private LocationListener locationListener;

    static int portnumber = 1234;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        tview = new TextView(this);    
        new Thread()
        {
         public void run()
            {   
                try
                {
                    socket = new Socket("10.0.2.2", portnumber);

                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                    out.println("Connection  Established");

                }
                catch (Exception e)
                { 
                    tview.setText(e.toString());
                }


            }
        }.start();


        setContentView(tview);
        super.onCreate(savedInstanceState);

        lm = (LocationManager) 
        getSystemService(Context.LOCATION_SERVICE);    

        locationListener = new MyLocationListener();

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);  

    }

    private class MyLocationListener implements LocationListener 
    {


        @Override
        public void onLocationChanged(Location loc) {

        if (loc != null) {

                PrintWriter out;

    try 
        {
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

                    out.println("Location test");

                }
                catch (IOException e)
                {

                    e.printStackTrace();
                }



                Toast.makeText(getBaseContext()," Locationchanged : Lat: " + loc.getLatitude() + 
                    " Lng:  " + loc.getLongitude(), 
                    Toast.LENGTH_SHORT).show();

                try
                {

                    String line = in.readLine();
                    Log.v("readLine success", line);

                  Toast.makeText(getBaseContext(),line,Toast.LENGTH_SHORT).show();

                } 
                catch (Exception e)
                {
                    Log.v("readline","failed");
                }

            }
        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onStatusChanged(String provider, int status, 
            Bundle extras) {
            // TODO Auto-generated method stub
        }
    }  
}
  • 0
    Если вы зарегистрируете учетную запись, вы сможете редактировать свои сообщения и оставлять комментарии к ним.
Теги:

1 ответ

1

Я думаю, что проблема может заключаться в том, что и сетевая связь, и LocationListener работают на UIThread и блокируют друг друга. Должна ли работать связь с портом в другом потоке, а LocationListener снова работать.

  • 0
    Вы имеете в виду создание потока для сервера и еще одного для каждого клиента?
  • 0
    Ваш сервер уже использует поток для каждого входящего запроса, так что это должно быть хорошо. Но в активности Android вы общаетесь с сервером в методе onCreate () без использования потока. Поэтому, пока вы общаетесь с сервером, вы блокируете поток пользовательского интерфейса, и onLocationChanged () не может быть вызван.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню