From ab6c5717934258c13d635ee1d3e73b5e84f2ee54 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 11 Jul 2013 18:20:30 +0300 Subject: [PATCH] Add server --- .../src/main/AndroidManifest.xml | 22 +++------ .../socketfiletransfer/MainActivity.java | 7 ++- .../annimon/socketfiletransfer/Server.java | 47 +++++++++++++++++++ .../socketfiletransfer/ServerActivity.java | 45 ++++++++++++++++++ .../SocketTransferTask.java | 17 ++++++- .../socketfiletransfer/TransferServer.java | 44 +++++++++++++++++ .../operations/BrightnessOperation.java | 4 -- .../operations/CursorOperation.java | 2 - .../operations/FileOperation.java | 12 ++--- .../operations/MessageOperation.java | 2 + .../util/Configuration.java | 11 ++++- .../socketfiletransfer/util/Console.java | 31 ++++++++++++ .../src/main/res/layout/activity_server.xml | 20 ++++++++ .../src/main/res/values/strings.xml | 1 + 14 files changed, 229 insertions(+), 36 deletions(-) create mode 100644 SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/Server.java create mode 100644 SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/ServerActivity.java create mode 100644 SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/TransferServer.java create mode 100644 SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/util/Console.java create mode 100644 SocketFileTransfer/src/main/res/layout/activity_server.xml diff --git a/SocketFileTransfer/src/main/AndroidManifest.xml b/SocketFileTransfer/src/main/AndroidManifest.xml index 8c8cd17..9a4477f 100644 --- a/SocketFileTransfer/src/main/AndroidManifest.xml +++ b/SocketFileTransfer/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ android:minSdkVersion="7" android:targetSdkVersion="17" /> + @@ -41,22 +42,11 @@ - - - - - - - - + + + + + diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/MainActivity.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/MainActivity.java index 351f498..78e6e9f 100644 --- a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/MainActivity.java +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/MainActivity.java @@ -17,8 +17,6 @@ import android.widget.Toast; import com.annimon.socketfiletransfer.util.Configuration; -import java.io.File; - public class MainActivity extends Activity implements View.OnClickListener { @Override @@ -78,6 +76,8 @@ public class MainActivity extends Activity implements View.OnClickListener { final int id = (Integer) view.getTag(); switch (id) { case OperationListener.MODE_SERVER: + Intent servIntent = new Intent(this, ServerActivity.class); + startActivity(servIntent); break; case OperationListener.MODE_FILE_TRANSFER: @@ -117,8 +117,7 @@ public class MainActivity extends Activity implements View.OnClickListener { String path = uri.getPath(); if (uri.getScheme().startsWith("content")) path = getRealPathFromURI(uri); - File file = new File(path); - new SocketTransferTask(OperationListener.MODE_FILE_TRANSFER).execute(file); + new SocketTransferTask(OperationListener.MODE_FILE_TRANSFER).execute(path); } private String getRealPathFromURI(Uri contentUri) { diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/Server.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/Server.java new file mode 100644 index 0000000..a24428a --- /dev/null +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/Server.java @@ -0,0 +1,47 @@ +package com.annimon.socketfiletransfer; + +import com.annimon.socketfiletransfer.util.Config; +import com.annimon.socketfiletransfer.util.Console; +import com.annimon.socketfiletransfer.util.ExceptionHandler; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * + * @author aNNiMON + */ +public class Server { + + private final ServerSocket serverSocket; + + public Server() throws IOException { + serverSocket = new ServerSocket(Config.getPort()); + } + + public void listenClients() { + while (true) { + try { + Socket client = serverSocket.accept(); + new Thread(new TransferServer(client)).start(); + } catch (IOException ex) { + ExceptionHandler.log(ex); + break; + } + } + close(); + } + + private void close() { + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (IOException ex) { + ExceptionHandler.log(ex); + } + } + } + +} diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/ServerActivity.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/ServerActivity.java new file mode 100644 index 0000000..3d32d9e --- /dev/null +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/ServerActivity.java @@ -0,0 +1,45 @@ +package com.annimon.socketfiletransfer; + +import android.app.Activity; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.format.Formatter; +import android.widget.TextView; + +import com.annimon.socketfiletransfer.util.Console; + +public class ServerActivity extends Activity { + + private TextView messagesHistory; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_server); + + messagesHistory = (TextView) findViewById(R.id.messages_history); + messagesHistory.setText(Console.getAllText()); + + Handler handler = new Handler() { + + @Override + public void handleMessage(Message msg) { + messagesHistory.setText(Console.getAllText()); + } + }; + Console.setHandler(handler); + + WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE); + WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); + int ip = wifiInfo.getIpAddress(); + String ipAddress = Formatter.formatIpAddress(ip); + Console.println("Start server " + ipAddress); + + new SocketTransferTask(OperationListener.MODE_SERVER).execute(); + } + + +} diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/SocketTransferTask.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/SocketTransferTask.java index 8949cf5..bc560a1 100644 --- a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/SocketTransferTask.java +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/SocketTransferTask.java @@ -4,7 +4,9 @@ import android.os.AsyncTask; import android.util.Log; import com.annimon.socketfiletransfer.util.Config; +import com.annimon.socketfiletransfer.util.ExceptionHandler; +import java.io.IOException; import java.net.Socket; public class SocketTransferTask extends AsyncTask { @@ -18,6 +20,8 @@ public class SocketTransferTask extends AsyncTask { @Override protected Boolean doInBackground(Object... objects) { + if (mode == OperationListener.MODE_SERVER) return startServer(); + boolean success = true; OperationManager manager = new OperationManager(); try { @@ -26,8 +30,7 @@ public class SocketTransferTask extends AsyncTask { manager.execute(mode, objects); } catch (Exception e) { success = false; - e.printStackTrace(); - Log.e("SFT", e.getMessage(), e); + ExceptionHandler.log(e); } finally { if (manager != null) manager.close(); } @@ -35,6 +38,16 @@ public class SocketTransferTask extends AsyncTask { return success; } + private boolean startServer() { + try { + Server server = new Server(); + server.listenClients(); + } catch (IOException e) { + ExceptionHandler.log(e); + } + return true; + } + @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/TransferServer.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/TransferServer.java new file mode 100644 index 0000000..b8a9c83 --- /dev/null +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/TransferServer.java @@ -0,0 +1,44 @@ +package com.annimon.socketfiletransfer; + +import android.os.Handler; + +import com.annimon.socketfiletransfer.util.Console; +import com.annimon.socketfiletransfer.util.ExceptionHandler; +import com.annimon.socketfiletransfer.util.MessageHistory; + +import java.net.Socket; + +/** + * + * @author aNNiMON + */ +public class TransferServer implements Runnable { + + private final OperationListener listener; + private Handler handler; + + public TransferServer(Socket client) { + listener = new OperationListener(); + listener.setSocket(client); + printClientInfo(client); + } + + public void setHandler(Handler handler) { + this.handler = handler; + } + + @Override + public void run() { + try { + listener.listenOperation(); + } catch (Exception ex) { + ExceptionHandler.log(ex); + } + listener.close(); + } + + private void printClientInfo(Socket client) { + Console.println( client.getRemoteSocketAddress().toString() ); + } + +} diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/BrightnessOperation.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/BrightnessOperation.java index 14a21bf..d15e40d 100644 --- a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/BrightnessOperation.java +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/BrightnessOperation.java @@ -1,10 +1,6 @@ package com.annimon.socketfiletransfer.operations; import com.annimon.socketfiletransfer.OperationListener; - -import java.io.DataInputStream; -import java.io.DataOutputStream; - /** * @author aNNiMON */ diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/CursorOperation.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/CursorOperation.java index b1aba41..fac2d56 100644 --- a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/CursorOperation.java +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/CursorOperation.java @@ -8,8 +8,6 @@ import com.annimon.socketfiletransfer.OperationListener; import com.annimon.socketfiletransfer.TouchpadView; import com.annimon.socketfiletransfer.util.ExceptionHandler; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; /** diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/FileOperation.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/FileOperation.java index 9029e9d..553ba96 100644 --- a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/FileOperation.java +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/FileOperation.java @@ -1,12 +1,9 @@ package com.annimon.socketfiletransfer.operations; -import com.annimon.socketfiletransfer.MainActivity; import com.annimon.socketfiletransfer.OperationListener; -import com.annimon.socketfiletransfer.OperationManager; +import com.annimon.socketfiletransfer.util.Console; import com.annimon.socketfiletransfer.util.ExceptionHandler; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -25,6 +22,7 @@ public class FileOperation extends Operation { FileOutputStream fout = null; try { String name = dis.readUTF(); + Console.println("Filename: " + name); fout = new FileOutputStream("/mnt/sdcard/" + name);//Config.getTransferDir() + name); byte[] buffer = new byte[BUFFER_SIZE]; int count; @@ -32,12 +30,11 @@ public class FileOperation extends Operation { fout.write(buffer, 0, count); } fout.flush(); - fout.close(); } catch (IOException ex) { ExceptionHandler.log(ex); } finally { try { - fout.close(); + if (fout != null) fout.close(); } catch (IOException ex) { ExceptionHandler.log(ex); } @@ -46,7 +43,8 @@ public class FileOperation extends Operation { @Override public void startClientSide(Object... params) throws Exception { - File file = (File) params[0]; + String filePath = (String) params[0]; + File file = new File(filePath); dos.writeInt(OperationListener.MODE_FILE_TRANSFER); diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/MessageOperation.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/MessageOperation.java index f4527fc..707fd7a 100644 --- a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/MessageOperation.java +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/operations/MessageOperation.java @@ -3,6 +3,7 @@ package com.annimon.socketfiletransfer.operations; import android.util.Log; import com.annimon.socketfiletransfer.OperationListener; +import com.annimon.socketfiletransfer.util.Console; import com.annimon.socketfiletransfer.util.MessageHistory; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -17,6 +18,7 @@ public class MessageOperation extends Operation { @Override public void startServerSide() throws IOException { String text = dis.readUTF(); + Console.println(text); MessageHistory.addMessage(text); } diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/util/Configuration.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/util/Configuration.java index fffbf64..3aa35a8 100644 --- a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/util/Configuration.java +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/util/Configuration.java @@ -37,6 +37,15 @@ public class Configuration { public int getProperty(String key, int defaultValue) { if (preferences == null) return defaultValue; - return preferences.getInt(key, defaultValue); + try { + return preferences.getInt(key, defaultValue); + } catch (Exception e) { + String defValue = String.valueOf(defaultValue); + try { + return Integer.parseInt(preferences.getString(key, defValue)); + } catch (NumberFormatException e1) { + return defaultValue; + } + } } } diff --git a/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/util/Console.java b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/util/Console.java new file mode 100644 index 0000000..5be79fe --- /dev/null +++ b/SocketFileTransfer/src/main/java/com/annimon/socketfiletransfer/util/Console.java @@ -0,0 +1,31 @@ +package com.annimon.socketfiletransfer.util; + +import android.os.Handler; + +/** + * @author aNNiMON + */ +public class Console { + + private static Handler handler; + private static StringBuilder allText = new StringBuilder(); + + public static void print(String message) { + allText.append(message); + if (handler != null) handler.sendEmptyMessage(1); + } + + public static void println(String message) { + print(message); + print("\r\n"); + } + + public static String getAllText() { + return allText.toString(); + } + + public static void setHandler(Handler handler) { + Console.handler = handler; + } + +} diff --git a/SocketFileTransfer/src/main/res/layout/activity_server.xml b/SocketFileTransfer/src/main/res/layout/activity_server.xml new file mode 100644 index 0000000..60d9c07 --- /dev/null +++ b/SocketFileTransfer/src/main/res/layout/activity_server.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/SocketFileTransfer/src/main/res/values/strings.xml b/SocketFileTransfer/src/main/res/values/strings.xml index 6d37d2a..0ca5f05 100644 --- a/SocketFileTransfer/src/main/res/values/strings.xml +++ b/SocketFileTransfer/src/main/res/values/strings.xml @@ -5,6 +5,7 @@ Settings Send message Application not found + Server Messages Cursor control Brightness control