Add server

This commit is contained in:
Victor 2013-07-11 18:20:30 +03:00
parent b74b35cec0
commit ab6c571793
14 changed files with 229 additions and 36 deletions

View File

@ -8,6 +8,7 @@
android:minSdkVersion="7"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@ -41,22 +42,11 @@
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name="com.annimon.socketfiletransfer.MessagesActivity"
android:label="@string/title_activity_messages" >
</activity>
<activity
android:name="com.annimon.socketfiletransfer.CursorActivity"
android:label="@string/title_activity_cursor" >
</activity>
<activity
android:name="com.annimon.socketfiletransfer.BrightnessActivity"
android:label="@string/title_activity_brightness" >
</activity>
<activity
android:name="com.annimon.socketfiletransfer.SettingsActivity"
android:label="@string/action_settings" >
</activity>
<activity android:name="com.annimon.socketfiletransfer.ServerActivity" android:label="@string/title_activity_server" />
<activity android:name="com.annimon.socketfiletransfer.MessagesActivity" android:label="@string/title_activity_messages" />
<activity android:name="com.annimon.socketfiletransfer.CursorActivity" android:label="@string/title_activity_cursor" />
<activity android:name="com.annimon.socketfiletransfer.BrightnessActivity" android:label="@string/title_activity_brightness" />
<activity android:name="com.annimon.socketfiletransfer.SettingsActivity" android:label="@string/action_settings" />
</application>
</manifest>

View File

@ -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) {

View File

@ -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);
}
}
}
}

View File

@ -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();
}
}

View File

@ -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<Object, Void, Boolean> {
@ -18,6 +20,8 @@ public class SocketTransferTask extends AsyncTask<Object, Void, Boolean> {
@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<Object, Void, Boolean> {
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<Object, Void, Boolean> {
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);

View File

@ -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() );
}
}

View File

@ -1,10 +1,6 @@
package com.annimon.socketfiletransfer.operations;
import com.annimon.socketfiletransfer.OperationListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
/**
* @author aNNiMON
*/

View File

@ -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;
/**

View File

@ -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);

View File

@ -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);
}

View File

@ -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;
}
}
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,20 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".ServerActivity">
<ScrollView android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/messages_history"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>

View File

@ -5,6 +5,7 @@
<string name="action_settings">Settings</string>
<string name="send_message">Send message</string>
<string name="app_not_found">Application not found</string>
<string name="title_activity_server">Server</string>
<string name="title_activity_messages">Messages</string>
<string name="title_activity_cursor">Cursor control</string>
<string name="title_activity_brightness">Brightness control</string>