Server with Multiple Android Clients
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
}
}
}
Log cat:
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@app@vmdl34515.tmp@classes.dex -> /data/dalvik-cache/data@app@com.servertest.apk@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
Update:
I'm still having trouble writing from the server to the clients. For now, communication is only one way开发者_JS百科, from client to server. I don't know what I'm doing wrong as I tried for a number of times without success. Any help would be greatly appreciated. Here's my code:
Server Class:
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");
}
}
}
}
and the Android Activity:
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
}
}
}
I think the problem might be, that both, the network communication and the LocationListener run on the UIThread and block each other. Do the communication with the sever in another thread and the LocationListener should be working again.
精彩评论