Wednesday, February 18, 2009
Android LocalSocket / LocalServerSocket sample code
Abstract: This short code sample demonstrates how one can to use LocalSocket (LocalServerSocket) in Android SDK.
Platforms: Android SDK 1.0 (Eclipse 3.4.1 + ADT 0.8.0)
Add one button into your layout (main.xml):
<Button android:id="@+id/send_1_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="send 1 request"/>
And this simple code for your activity
import java.io.IOException; import java.io.InputStream; import android.app.Activity; import android.net.LocalServerSocket; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; /** * * @author Denis Migol * */ public class DemoActivity extends Activity { public static String SOCKET_ADDRESS = "your.local.socket.address"; // background threads use this Handler to post messages to // the main application thread private final Handler handler = new Handler(); public class NotificationRunnable implements Runnable { private String message = null; public void run() { if (message != null && message.length() > 0) { showNotification(message); } } /** * @param message the message to set */ public void setMessage(String message) { this.message = message; } } // post this to the Handler when the background thread notifies private final NotificationRunnable notificationRunnable = new NotificationRunnable(); public void showNotification(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } class SocketListener extends Thread { private Handler handler = null; private NotificationRunnable runnable = null; public SocketListener(Handler handler, NotificationRunnable runnable) { this.handler = handler; this.runnable = runnable; this.handler.post(this.runnable); } /** * Show UI notification. * @param message */ private void showMessage(String message) { this.runnable.setMessage(message); this.handler.post(this.runnable); } @Override public void run() { //showMessage("DEMO: SocketListener started!"); try { LocalServerSocket server = new LocalServerSocket(SOCKET_ADDRESS); while (true) { LocalSocket receiver = server.accept(); if (receiver != null) { InputStream input = receiver.getInputStream(); // simply for java.util.ArrayList int readed = input.read(); int size = 0; int capacity = 0; byte[] bytes = new byte[capacity]; // reading while (readed != -1) { // java.util.ArrayList.Add(E e); capacity = (capacity * 3)/2 + 1; //bytes = Arrays.copyOf(bytes, capacity); byte[] copy = new byte[capacity]; System.arraycopy(bytes, 0, copy, 0, bytes.length); bytes = copy; bytes[size++] = (byte)readed; // read next byte readed = input.read(); } showMessage(new String(bytes, 0, size)); } } } catch (IOException e) { Log.e(getClass().getName(), e.getMessage()); } } } public static void writeSocket(String message) throws IOException { LocalSocket sender = new LocalSocket(); sender.connect(new LocalSocketAddress(SOCKET_ADDRESS)); sender.getOutputStream().write(message.getBytes()); sender.getOutputStream().close(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new SocketListener(this.handler, this.notificationRunnable).start(); Button send1 = (Button)findViewById(R.id.send_1_button); send1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { writeSocket("hello"); } catch (IOException e) { Log.e(getClass().getName(), e.getMessage()); } } }); } }
댓글 없음:
댓글 쓰기