Add server
This commit is contained in:
parent
b74b35cec0
commit
ab6c571793
@ -8,6 +8,7 @@
|
|||||||
android:minSdkVersion="7"
|
android:minSdkVersion="7"
|
||||||
android:targetSdkVersion="17" />
|
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.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
@ -41,22 +42,11 @@
|
|||||||
<data android:mimeType="text/plain" />
|
<data android:mimeType="text/plain" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity android:name="com.annimon.socketfiletransfer.ServerActivity" android:label="@string/title_activity_server" />
|
||||||
android:name="com.annimon.socketfiletransfer.MessagesActivity"
|
<activity android:name="com.annimon.socketfiletransfer.MessagesActivity" android:label="@string/title_activity_messages" />
|
||||||
android:label="@string/title_activity_messages" >
|
<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" />
|
||||||
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>
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
@ -17,8 +17,6 @@ import android.widget.Toast;
|
|||||||
|
|
||||||
import com.annimon.socketfiletransfer.util.Configuration;
|
import com.annimon.socketfiletransfer.util.Configuration;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
public class MainActivity extends Activity implements View.OnClickListener {
|
public class MainActivity extends Activity implements View.OnClickListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -78,6 +76,8 @@ public class MainActivity extends Activity implements View.OnClickListener {
|
|||||||
final int id = (Integer) view.getTag();
|
final int id = (Integer) view.getTag();
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case OperationListener.MODE_SERVER:
|
case OperationListener.MODE_SERVER:
|
||||||
|
Intent servIntent = new Intent(this, ServerActivity.class);
|
||||||
|
startActivity(servIntent);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OperationListener.MODE_FILE_TRANSFER:
|
case OperationListener.MODE_FILE_TRANSFER:
|
||||||
@ -117,8 +117,7 @@ public class MainActivity extends Activity implements View.OnClickListener {
|
|||||||
String path = uri.getPath();
|
String path = uri.getPath();
|
||||||
if (uri.getScheme().startsWith("content")) path = getRealPathFromURI(uri);
|
if (uri.getScheme().startsWith("content")) path = getRealPathFromURI(uri);
|
||||||
|
|
||||||
File file = new File(path);
|
new SocketTransferTask(OperationListener.MODE_FILE_TRANSFER).execute(path);
|
||||||
new SocketTransferTask(OperationListener.MODE_FILE_TRANSFER).execute(file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getRealPathFromURI(Uri contentUri) {
|
private String getRealPathFromURI(Uri contentUri) {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -4,7 +4,9 @@ import android.os.AsyncTask;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.annimon.socketfiletransfer.util.Config;
|
import com.annimon.socketfiletransfer.util.Config;
|
||||||
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
|
||||||
public class SocketTransferTask extends AsyncTask<Object, Void, Boolean> {
|
public class SocketTransferTask extends AsyncTask<Object, Void, Boolean> {
|
||||||
@ -18,6 +20,8 @@ public class SocketTransferTask extends AsyncTask<Object, Void, Boolean> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Boolean doInBackground(Object... objects) {
|
protected Boolean doInBackground(Object... objects) {
|
||||||
|
if (mode == OperationListener.MODE_SERVER) return startServer();
|
||||||
|
|
||||||
boolean success = true;
|
boolean success = true;
|
||||||
OperationManager manager = new OperationManager();
|
OperationManager manager = new OperationManager();
|
||||||
try {
|
try {
|
||||||
@ -26,8 +30,7 @@ public class SocketTransferTask extends AsyncTask<Object, Void, Boolean> {
|
|||||||
manager.execute(mode, objects);
|
manager.execute(mode, objects);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
success = false;
|
success = false;
|
||||||
e.printStackTrace();
|
ExceptionHandler.log(e);
|
||||||
Log.e("SFT", e.getMessage(), e);
|
|
||||||
} finally {
|
} finally {
|
||||||
if (manager != null) manager.close();
|
if (manager != null) manager.close();
|
||||||
}
|
}
|
||||||
@ -35,6 +38,16 @@ public class SocketTransferTask extends AsyncTask<Object, Void, Boolean> {
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean startServer() {
|
||||||
|
try {
|
||||||
|
Server server = new Server();
|
||||||
|
server.listenClients();
|
||||||
|
} catch (IOException e) {
|
||||||
|
ExceptionHandler.log(e);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(Boolean result) {
|
protected void onPostExecute(Boolean result) {
|
||||||
super.onPostExecute(result);
|
super.onPostExecute(result);
|
||||||
|
@ -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() );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,10 +1,6 @@
|
|||||||
package com.annimon.socketfiletransfer.operations;
|
package com.annimon.socketfiletransfer.operations;
|
||||||
|
|
||||||
import com.annimon.socketfiletransfer.OperationListener;
|
import com.annimon.socketfiletransfer.OperationListener;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author aNNiMON
|
* @author aNNiMON
|
||||||
*/
|
*/
|
||||||
|
@ -8,8 +8,6 @@ import com.annimon.socketfiletransfer.OperationListener;
|
|||||||
import com.annimon.socketfiletransfer.TouchpadView;
|
import com.annimon.socketfiletransfer.TouchpadView;
|
||||||
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
package com.annimon.socketfiletransfer.operations;
|
package com.annimon.socketfiletransfer.operations;
|
||||||
|
|
||||||
import com.annimon.socketfiletransfer.MainActivity;
|
|
||||||
import com.annimon.socketfiletransfer.OperationListener;
|
import com.annimon.socketfiletransfer.OperationListener;
|
||||||
import com.annimon.socketfiletransfer.OperationManager;
|
import com.annimon.socketfiletransfer.util.Console;
|
||||||
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -25,6 +22,7 @@ public class FileOperation extends Operation {
|
|||||||
FileOutputStream fout = null;
|
FileOutputStream fout = null;
|
||||||
try {
|
try {
|
||||||
String name = dis.readUTF();
|
String name = dis.readUTF();
|
||||||
|
Console.println("Filename: " + name);
|
||||||
fout = new FileOutputStream("/mnt/sdcard/" + name);//Config.getTransferDir() + name);
|
fout = new FileOutputStream("/mnt/sdcard/" + name);//Config.getTransferDir() + name);
|
||||||
byte[] buffer = new byte[BUFFER_SIZE];
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
int count;
|
int count;
|
||||||
@ -32,12 +30,11 @@ public class FileOperation extends Operation {
|
|||||||
fout.write(buffer, 0, count);
|
fout.write(buffer, 0, count);
|
||||||
}
|
}
|
||||||
fout.flush();
|
fout.flush();
|
||||||
fout.close();
|
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
ExceptionHandler.log(ex);
|
ExceptionHandler.log(ex);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
fout.close();
|
if (fout != null) fout.close();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
ExceptionHandler.log(ex);
|
ExceptionHandler.log(ex);
|
||||||
}
|
}
|
||||||
@ -46,7 +43,8 @@ public class FileOperation extends Operation {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startClientSide(Object... params) throws Exception {
|
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);
|
dos.writeInt(OperationListener.MODE_FILE_TRANSFER);
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package com.annimon.socketfiletransfer.operations;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.annimon.socketfiletransfer.OperationListener;
|
import com.annimon.socketfiletransfer.OperationListener;
|
||||||
|
import com.annimon.socketfiletransfer.util.Console;
|
||||||
import com.annimon.socketfiletransfer.util.MessageHistory;
|
import com.annimon.socketfiletransfer.util.MessageHistory;
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
@ -17,6 +18,7 @@ public class MessageOperation extends Operation {
|
|||||||
@Override
|
@Override
|
||||||
public void startServerSide() throws IOException {
|
public void startServerSide() throws IOException {
|
||||||
String text = dis.readUTF();
|
String text = dis.readUTF();
|
||||||
|
Console.println(text);
|
||||||
MessageHistory.addMessage(text);
|
MessageHistory.addMessage(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,15 @@ public class Configuration {
|
|||||||
public int getProperty(String key, int defaultValue) {
|
public int getProperty(String key, int defaultValue) {
|
||||||
if (preferences == null) return defaultValue;
|
if (preferences == null) return defaultValue;
|
||||||
|
|
||||||
|
try {
|
||||||
return preferences.getInt(key, defaultValue);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
20
SocketFileTransfer/src/main/res/layout/activity_server.xml
Normal file
20
SocketFileTransfer/src/main/res/layout/activity_server.xml
Normal 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>
|
@ -5,6 +5,7 @@
|
|||||||
<string name="action_settings">Settings</string>
|
<string name="action_settings">Settings</string>
|
||||||
<string name="send_message">Send message</string>
|
<string name="send_message">Send message</string>
|
||||||
<string name="app_not_found">Application not found</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_messages">Messages</string>
|
||||||
<string name="title_activity_cursor">Cursor control</string>
|
<string name="title_activity_cursor">Cursor control</string>
|
||||||
<string name="title_activity_brightness">Brightness control</string>
|
<string name="title_activity_brightness">Brightness control</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user