Начальный вариант проекта
This commit is contained in:
commit
6e5b0d66e6
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/build/
|
||||||
|
/dist/
|
74
build.xml
Normal file
74
build.xml
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- You may freely edit this file. See commented blocks below for -->
|
||||||
|
<!-- some examples of how to customize the build. -->
|
||||||
|
<!-- (If you delete it and reopen the project it will be recreated.) -->
|
||||||
|
<!-- By default, only the Clean and Build commands use this build script. -->
|
||||||
|
<!-- Commands such as Run, Debug, and Test only use this build script if -->
|
||||||
|
<!-- the Compile on Save feature is turned off for the project. -->
|
||||||
|
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
|
||||||
|
<!-- in the project's Project Properties dialog box.-->
|
||||||
|
<project name="SocketFileTransfer" default="default" basedir=".">
|
||||||
|
<description>Builds, tests, and runs the project SocketFileTransfer.</description>
|
||||||
|
<import file="nbproject/build-impl.xml"/>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
There exist several targets which are by default empty and which can be
|
||||||
|
used for execution of your tasks. These targets are usually executed
|
||||||
|
before and after some main targets. They are:
|
||||||
|
|
||||||
|
-pre-init: called before initialization of project properties
|
||||||
|
-post-init: called after initialization of project properties
|
||||||
|
-pre-compile: called before javac compilation
|
||||||
|
-post-compile: called after javac compilation
|
||||||
|
-pre-compile-single: called before javac compilation of single file
|
||||||
|
-post-compile-single: called after javac compilation of single file
|
||||||
|
-pre-compile-test: called before javac compilation of JUnit tests
|
||||||
|
-post-compile-test: called after javac compilation of JUnit tests
|
||||||
|
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||||
|
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||||
|
-pre-jar: called before JAR building
|
||||||
|
-post-jar: called after JAR building
|
||||||
|
-post-clean: called after cleaning build products
|
||||||
|
|
||||||
|
(Targets beginning with '-' are not intended to be called on their own.)
|
||||||
|
|
||||||
|
Example of inserting an obfuscator after compilation could look like this:
|
||||||
|
|
||||||
|
<target name="-post-compile">
|
||||||
|
<obfuscate>
|
||||||
|
<fileset dir="${build.classes.dir}"/>
|
||||||
|
</obfuscate>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
For list of available properties check the imported
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
|
||||||
|
Another way to customize the build is by overriding existing main targets.
|
||||||
|
The targets of interest are:
|
||||||
|
|
||||||
|
-init-macrodef-javac: defines macro for javac compilation
|
||||||
|
-init-macrodef-junit: defines macro for junit execution
|
||||||
|
-init-macrodef-debug: defines macro for class debugging
|
||||||
|
-init-macrodef-java: defines macro for class execution
|
||||||
|
-do-jar-with-manifest: JAR building (if you are using a manifest)
|
||||||
|
-do-jar-without-manifest: JAR building (if you are not using a manifest)
|
||||||
|
run: execution of project
|
||||||
|
-javadoc-build: Javadoc generation
|
||||||
|
test-report: JUnit report generation
|
||||||
|
|
||||||
|
An example of overriding the target for project execution could look like this:
|
||||||
|
|
||||||
|
<target name="run" depends="SocketFileTransfer-impl.jar">
|
||||||
|
<exec dir="bin" executable="launcher.exe">
|
||||||
|
<arg file="${dist.jar}"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
Notice that the overridden target depends on the jar target and not only on
|
||||||
|
the compile target as the regular run target does. Again, for a list of available
|
||||||
|
properties which you can use, check the target you are overriding in the
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
-->
|
||||||
|
</project>
|
3
manifest.mf
Normal file
3
manifest.mf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
X-COMMENT: Main-Class will be added automatically by build
|
||||||
|
|
1411
nbproject/build-impl.xml
Normal file
1411
nbproject/build-impl.xml
Normal file
File diff suppressed because it is too large
Load Diff
8
nbproject/genfiles.properties
Normal file
8
nbproject/genfiles.properties
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
build.xml.data.CRC32=b5a554e2
|
||||||
|
build.xml.script.CRC32=5cee8796
|
||||||
|
build.xml.stylesheet.CRC32=28e38971@1.56.0.46
|
||||||
|
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||||
|
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||||
|
nbproject/build-impl.xml.data.CRC32=b5a554e2
|
||||||
|
nbproject/build-impl.xml.script.CRC32=1f769548
|
||||||
|
nbproject/build-impl.xml.stylesheet.CRC32=c6d2a60f@1.56.0.46
|
73
nbproject/project.properties
Normal file
73
nbproject/project.properties
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
annotation.processing.enabled=true
|
||||||
|
annotation.processing.enabled.in.editor=false
|
||||||
|
annotation.processing.processors.list=
|
||||||
|
annotation.processing.run.all.processors=true
|
||||||
|
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
|
||||||
|
application.title=SocketFileTransfer
|
||||||
|
application.vendor=aNNiMON
|
||||||
|
build.classes.dir=${build.dir}/classes
|
||||||
|
build.classes.excludes=**/*.java,**/*.form
|
||||||
|
# This directory is removed when the project is cleaned:
|
||||||
|
build.dir=build
|
||||||
|
build.generated.dir=${build.dir}/generated
|
||||||
|
build.generated.sources.dir=${build.dir}/generated-sources
|
||||||
|
# Only compile against the classpath explicitly listed here:
|
||||||
|
build.sysclasspath=ignore
|
||||||
|
build.test.classes.dir=${build.dir}/test/classes
|
||||||
|
build.test.results.dir=${build.dir}/test/results
|
||||||
|
# Uncomment to specify the preferred debugger connection transport:
|
||||||
|
#debug.transport=dt_socket
|
||||||
|
debug.classpath=\
|
||||||
|
${run.classpath}
|
||||||
|
debug.test.classpath=\
|
||||||
|
${run.test.classpath}
|
||||||
|
# This directory is removed when the project is cleaned:
|
||||||
|
dist.dir=dist
|
||||||
|
dist.jar=${dist.dir}/SocketFileTransfer.jar
|
||||||
|
dist.javadoc.dir=${dist.dir}/javadoc
|
||||||
|
endorsed.classpath=
|
||||||
|
excludes=
|
||||||
|
includes=**
|
||||||
|
jar.compress=false
|
||||||
|
javac.classpath=
|
||||||
|
# Space-separated list of extra javac options
|
||||||
|
javac.compilerargs=
|
||||||
|
javac.deprecation=false
|
||||||
|
javac.processorpath=\
|
||||||
|
${javac.classpath}
|
||||||
|
javac.source=1.7
|
||||||
|
javac.target=1.7
|
||||||
|
javac.test.classpath=\
|
||||||
|
${javac.classpath}:\
|
||||||
|
${build.classes.dir}
|
||||||
|
javac.test.processorpath=\
|
||||||
|
${javac.test.classpath}
|
||||||
|
javadoc.additionalparam=
|
||||||
|
javadoc.author=false
|
||||||
|
javadoc.encoding=${source.encoding}
|
||||||
|
javadoc.noindex=false
|
||||||
|
javadoc.nonavbar=false
|
||||||
|
javadoc.notree=false
|
||||||
|
javadoc.private=false
|
||||||
|
javadoc.splitindex=true
|
||||||
|
javadoc.use=true
|
||||||
|
javadoc.version=false
|
||||||
|
javadoc.windowtitle=
|
||||||
|
main.class=com.annimon.socketfiletransfer.Main
|
||||||
|
manifest.file=manifest.mf
|
||||||
|
meta.inf.dir=${src.dir}/META-INF
|
||||||
|
mkdist.disabled=false
|
||||||
|
platform.active=default_platform
|
||||||
|
run.classpath=\
|
||||||
|
${javac.classpath}:\
|
||||||
|
${build.classes.dir}
|
||||||
|
# Space-separated list of JVM arguments used when running the project.
|
||||||
|
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
|
||||||
|
# To set system properties for unit tests define test-sys-prop.name=value:
|
||||||
|
run.jvmargs=
|
||||||
|
run.test.classpath=\
|
||||||
|
${javac.test.classpath}:\
|
||||||
|
${build.test.classes.dir}
|
||||||
|
source.encoding=windows-1251
|
||||||
|
src.dir=src
|
||||||
|
test.src.dir=test
|
15
nbproject/project.xml
Normal file
15
nbproject/project.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>org.netbeans.modules.java.j2seproject</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<name>SocketFileTransfer</name>
|
||||||
|
<source-roots>
|
||||||
|
<root id="src.dir"/>
|
||||||
|
</source-roots>
|
||||||
|
<test-roots>
|
||||||
|
<root id="test.src.dir"/>
|
||||||
|
</test-roots>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
40
src/com/annimon/socketfiletransfer/Client.java
Normal file
40
src/com/annimon/socketfiletransfer/Client.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
import com.annimon.socketfiletransfer.util.Config;
|
||||||
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class Client {
|
||||||
|
|
||||||
|
private Socket clientSocket;
|
||||||
|
private OperationManager manager;
|
||||||
|
|
||||||
|
public Client(String host) throws IOException {
|
||||||
|
clientSocket = new Socket(host, Config.getPort());
|
||||||
|
manager = new OperationManager();
|
||||||
|
manager.setSocket(clientSocket);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperationManager getManager() {
|
||||||
|
return manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
if (manager != null) {
|
||||||
|
manager.close();
|
||||||
|
}
|
||||||
|
if (clientSocket != null) {
|
||||||
|
try {
|
||||||
|
clientSocket.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
78
src/com/annimon/socketfiletransfer/FileOperation.java
Normal file
78
src/com/annimon/socketfiletransfer/FileOperation.java
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* aNNiMON 2013
|
||||||
|
*/
|
||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
import com.annimon.socketfiletransfer.util.Config;
|
||||||
|
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;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class FileOperation implements Operation {
|
||||||
|
|
||||||
|
private static final int BUFFER_SIZE = 1024;
|
||||||
|
|
||||||
|
private DataInputStream dis;
|
||||||
|
private DataOutputStream dos;
|
||||||
|
|
||||||
|
public FileOperation(DataInputStream dis) {
|
||||||
|
this.dis = dis;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileOperation(DataOutputStream dos) {
|
||||||
|
this.dos = dos;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startServerSide() {
|
||||||
|
FileOutputStream fout = null;
|
||||||
|
try {
|
||||||
|
String name = dis.readUTF();
|
||||||
|
System.out.println("Filename: " + name);
|
||||||
|
fout = new FileOutputStream(Config.getTransferDir() + name);
|
||||||
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
|
int count;
|
||||||
|
while ((count = dis.read(buffer, 0, BUFFER_SIZE)) != -1) {
|
||||||
|
fout.write(buffer, 0, count);
|
||||||
|
}
|
||||||
|
fout.flush();
|
||||||
|
fout.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
fout.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startClientSide(Object... params) throws Exception {
|
||||||
|
File file = (File) params[0];
|
||||||
|
|
||||||
|
dos.writeInt(OperationManager.MODE_FILE_TRANSFER);
|
||||||
|
|
||||||
|
String name = file.getName();
|
||||||
|
dos.writeUTF(name);
|
||||||
|
|
||||||
|
FileInputStream fis = new FileInputStream(file);
|
||||||
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
|
int count;
|
||||||
|
while ((count = fis.read(buffer, 0, BUFFER_SIZE)) != -1) {
|
||||||
|
dos.write(buffer, 0, count);
|
||||||
|
}
|
||||||
|
dos.flush();
|
||||||
|
fis.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
47
src/com/annimon/socketfiletransfer/Main.java
Normal file
47
src/com/annimon/socketfiletransfer/Main.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* aNNiMON 2013
|
||||||
|
*/
|
||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
if (args[0].equalsIgnoreCase("server")) {
|
||||||
|
try {
|
||||||
|
Server server = new Server();
|
||||||
|
server.listenClients();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String host = "127.0.0.1";
|
||||||
|
try {
|
||||||
|
Client client = new Client(getHostIp(host));
|
||||||
|
if (args[1].equalsIgnoreCase("file")) {
|
||||||
|
String filePath = args[2];
|
||||||
|
client.getManager().sendFile( new File(filePath) );
|
||||||
|
} else if (args[1].equalsIgnoreCase("message")) {
|
||||||
|
String message = args[2];
|
||||||
|
client.getManager().sendMessage(message);
|
||||||
|
}
|
||||||
|
client.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getHostIp(String defaultIp) {
|
||||||
|
return JOptionPane.showInputDialog(null, "Enter server host IP:", defaultIp);
|
||||||
|
}
|
||||||
|
}
|
28
src/com/annimon/socketfiletransfer/MessageHistory.java
Normal file
28
src/com/annimon/socketfiletransfer/MessageHistory.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* aNNiMON 2013
|
||||||
|
*/
|
||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class MessageHistory {
|
||||||
|
|
||||||
|
private static String lastMessage = "";
|
||||||
|
private static StringBuilder allText = new StringBuilder();
|
||||||
|
|
||||||
|
public static void addMessage(String message) {
|
||||||
|
lastMessage = message;
|
||||||
|
allText.append(message).append("\r\n\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getLastMessage() {
|
||||||
|
return lastMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getAllText() {
|
||||||
|
return allText.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
41
src/com/annimon/socketfiletransfer/MessageOperation.java
Normal file
41
src/com/annimon/socketfiletransfer/MessageOperation.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* aNNiMON 2013
|
||||||
|
*/
|
||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class MessageOperation implements Operation {
|
||||||
|
|
||||||
|
private DataInputStream dis;
|
||||||
|
private DataOutputStream dos;
|
||||||
|
|
||||||
|
public MessageOperation(DataInputStream dis) {
|
||||||
|
this.dis = dis;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageOperation(DataOutputStream dos) {
|
||||||
|
this.dos = dos;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startServerSide() throws IOException {
|
||||||
|
String text = dis.readUTF();
|
||||||
|
MessageHistory.addMessage(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startClientSide(Object... params) throws Exception {
|
||||||
|
String message = (String) params[0];
|
||||||
|
|
||||||
|
dos.writeInt(OperationManager.MODE_MESSAGE_TRANSFER);
|
||||||
|
dos.writeUTF(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
13
src/com/annimon/socketfiletransfer/Operation.java
Normal file
13
src/com/annimon/socketfiletransfer/Operation.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public interface Operation {
|
||||||
|
|
||||||
|
void startServerSide() throws Exception;
|
||||||
|
|
||||||
|
void startClientSide(Object... params) throws Exception;
|
||||||
|
|
||||||
|
}
|
67
src/com/annimon/socketfiletransfer/OperationListener.java
Normal file
67
src/com/annimon/socketfiletransfer/OperationListener.java
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ïðîñëóøèâàíèå îïåðàöèé ñ äàííûìè.
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class OperationListener {
|
||||||
|
|
||||||
|
protected static final int
|
||||||
|
MODE_FILE_TRANSFER = 1,
|
||||||
|
MODE_MESSAGE_TRANSFER = 2;
|
||||||
|
|
||||||
|
protected DataInputStream dis;
|
||||||
|
protected DataOutputStream dos;
|
||||||
|
|
||||||
|
public void setSocket(Socket socket) {
|
||||||
|
try {
|
||||||
|
dis = new DataInputStream( socket.getInputStream() );
|
||||||
|
dos = new DataOutputStream( socket.getOutputStream() );
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void listenOperation() throws Exception {
|
||||||
|
int mode = dis.readInt();
|
||||||
|
System.out.println("Read mode: " + mode);
|
||||||
|
Operation operation;
|
||||||
|
switch(mode) {
|
||||||
|
case MODE_FILE_TRANSFER:
|
||||||
|
System.out.println("MODE_FILE_TRANSFER");
|
||||||
|
operation = new FileOperation(dis);
|
||||||
|
break;
|
||||||
|
case MODE_MESSAGE_TRANSFER:
|
||||||
|
operation = new MessageOperation(dis);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (operation != null) {
|
||||||
|
operation.startServerSide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
if (dis != null) {
|
||||||
|
try {
|
||||||
|
dis.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dos != null) {
|
||||||
|
try {
|
||||||
|
dos.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
21
src/com/annimon/socketfiletransfer/OperationManager.java
Normal file
21
src/com/annimon/socketfiletransfer/OperationManager.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ìåíåäæåð îïåðàöèé ñ äàííûìè.
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class OperationManager extends OperationListener {
|
||||||
|
|
||||||
|
public void sendFile(File file) throws Exception {
|
||||||
|
Operation operation = new FileOperation(dos);
|
||||||
|
operation.startClientSide(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMessage(String message) throws Exception {
|
||||||
|
Operation operation = new MessageOperation(dos);
|
||||||
|
operation.startClientSide(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
44
src/com/annimon/socketfiletransfer/Server.java
Normal file
44
src/com/annimon/socketfiletransfer/Server.java
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
import com.annimon.socketfiletransfer.util.Config;
|
||||||
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class Server {
|
||||||
|
|
||||||
|
private 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.handle(ex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void close() {
|
||||||
|
if (serverSocket != null) {
|
||||||
|
try {
|
||||||
|
serverSocket.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
39
src/com/annimon/socketfiletransfer/TransferServer.java
Normal file
39
src/com/annimon/socketfiletransfer/TransferServer.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class TransferServer implements Runnable {
|
||||||
|
|
||||||
|
private OperationListener listener;
|
||||||
|
|
||||||
|
public TransferServer(Socket client) {
|
||||||
|
listener = new OperationListener();
|
||||||
|
listener.setSocket(client);
|
||||||
|
printClientInfo(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Thread thr = Thread.currentThread();
|
||||||
|
while(Thread.currentThread() == thr) {
|
||||||
|
try {
|
||||||
|
listener.listenOperation();
|
||||||
|
//Thread.sleep(1);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
listener.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void printClientInfo(Socket client) {
|
||||||
|
System.out.println( client.getRemoteSocketAddress().toString() );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
39
src/com/annimon/socketfiletransfer/util/Config.java
Normal file
39
src/com/annimon/socketfiletransfer/util/Config.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package com.annimon.socketfiletransfer.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class Config {
|
||||||
|
|
||||||
|
private static final String
|
||||||
|
TYPE = "TYPE",
|
||||||
|
PORT = "PORT",
|
||||||
|
TRANSFER_DIR = "TRANSFER_DIR";
|
||||||
|
|
||||||
|
public static boolean isServer() {
|
||||||
|
String type = Configuration.getInstance().getProperty(TYPE);
|
||||||
|
return (type.equalsIgnoreCase("server"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getPort() {
|
||||||
|
String value = Configuration.getInstance().getProperty(PORT);
|
||||||
|
try {
|
||||||
|
return Integer.parseInt(value);
|
||||||
|
} catch (NumberFormatException ex) {
|
||||||
|
ExceptionHandler.handle(ex);
|
||||||
|
return 7119;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getTransferDir() {
|
||||||
|
String path = Configuration.getInstance().getProperty(TRANSFER_DIR);
|
||||||
|
path = path.trim();
|
||||||
|
if (!path.endsWith(File.pathSeparator)) {
|
||||||
|
path = path + File.pathSeparator;
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
63
src/com/annimon/socketfiletransfer/util/Configuration.java
Normal file
63
src/com/annimon/socketfiletransfer/util/Configuration.java
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
package com.annimon.socketfiletransfer.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Êëàññ êîíôèãóðàöèè.
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
class Configuration {
|
||||||
|
|
||||||
|
private static final String PROPERTY_RESOURCE = "config.ini";
|
||||||
|
private static Configuration instance;
|
||||||
|
|
||||||
|
static synchronized Configuration getInstance() {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new Configuration();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Properties properties;
|
||||||
|
|
||||||
|
private Configuration() {
|
||||||
|
properties = new Properties();
|
||||||
|
readProperties();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProperty(String key) {
|
||||||
|
return properties.getProperty(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readProperties() {
|
||||||
|
// Åñëè ðÿäîì ñ ïðèëîæåíèåì íåò ôàéëà config.ini, òî ÷èòàåì èç ðåñóðñîâ.
|
||||||
|
InputStream stream = getInputStreamFromFile();
|
||||||
|
if (stream == null) {
|
||||||
|
stream = getClass().getResourceAsStream("/" + PROPERTY_RESOURCE);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
properties.load(stream);
|
||||||
|
stream.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ExceptionHandler.handle(ex, "read property");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private InputStream getInputStreamFromFile() {
|
||||||
|
File file = new File(PROPERTY_RESOURCE);
|
||||||
|
if (file.exists()) {
|
||||||
|
try {
|
||||||
|
return new FileInputStream(file);
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package com.annimon.socketfiletransfer.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Êëàññ îáðàáîòêè èñêëþ÷èòåëüíûõ ñèòóàöèé.
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class ExceptionHandler {
|
||||||
|
|
||||||
|
private static enum HANDLE_MODE {
|
||||||
|
NO_LOG, LOG_STACK_TRACE
|
||||||
|
};
|
||||||
|
|
||||||
|
private static HANDLE_MODE mode = HANDLE_MODE.LOG_STACK_TRACE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Óñòàíîâêà ðåæèìà, êîãäà âñå ñîîáùåíèÿ èãíîðèðóþòñÿ.
|
||||||
|
*/
|
||||||
|
public static void setNoLogMode() {
|
||||||
|
ExceptionHandler.mode = HANDLE_MODE.NO_LOG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Óñòàíîâêà ðåæèìà âûâîäà ëîãîâ íà êîíñîëü.
|
||||||
|
* Èñïîëüçóåòñÿ òðàññèðîâêà ñòåêà.
|
||||||
|
*/
|
||||||
|
public static void setStackTraceMode() {
|
||||||
|
ExceptionHandler.mode = HANDLE_MODE.LOG_STACK_TRACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void handle(Throwable throwable) {
|
||||||
|
if (mode == HANDLE_MODE.LOG_STACK_TRACE) {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void handle(Throwable throwable, String comment) {
|
||||||
|
if (mode == HANDLE_MODE.LOG_STACK_TRACE) {
|
||||||
|
System.out.println(comment);
|
||||||
|
handle(throwable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void handle(String comment) {
|
||||||
|
if (mode == HANDLE_MODE.LOG_STACK_TRACE) {
|
||||||
|
System.out.println(comment);
|
||||||
|
handle(new Throwable(comment));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
src/config.ini
Normal file
3
src/config.ini
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
TYPE=server
|
||||||
|
PORT=7119
|
||||||
|
TRANSFER_DIR=E:
|
Loading…
Reference in New Issue
Block a user