diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..26d33521af10bcc7fd8cea344038eaaeb78d0ef5
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5d8859c016a460088c8434eda6b0e6357a4770ac
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="FileSharing" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aa00ffab7828f4818589659c804ec2cfd99baed3
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000000000000000000000000000000000000..712ab9d985c20018a0c97b93d2148ac1ffe588a5
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..accd6296789966b9f3392c7a4dc3a987a7532182
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6c0b8635858dc7ad44b93df54b762707ce49eefc
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/pic1transferred.jpg b/pic1transferred.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ef005e374f4b456eeeac7a6e297fac1bfaff2cb2
Binary files /dev/null and b/pic1transferred.jpg differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7fa2bd56b9850ada0ec923c33a25233c39b608c9
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.example</groupId>
+    <artifactId>FileSharing</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/src/main/java/Client/Client.java b/src/main/java/Client/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7a63b3900ceecb30038c1ceb723930e42122d21
--- /dev/null
+++ b/src/main/java/Client/Client.java
@@ -0,0 +1,67 @@
+package Client;
+import java.net.*;
+import java.io.*;
+import java.nio.ByteBuffer;
+
+
+public class Client {
+    public static void main(String[] args) {
+        Socket clientSocket = null;
+        try{
+            clientSocket = new Socket("localhost",4333);
+            // use readlink -f filename to find file in Ubuntu terminal
+            String filename = "/home/jiahueic/Downloads/pic1.jpg";
+            File myFile = new File(filename);
+            System.out.println(myFile.exists());
+            // create random access file read-only
+            RandomAccessFile targetFile = new RandomAccessFile(filename,"r");
+            // returns the length of the file, measured in bytes
+            int fileSize = (int)targetFile.length();
+            // get output stream returns an output stream for writing bytes to this socket
+            // An Input/ Output error occurs as this socket is closed
+            OutputStream out = clientSocket.getOutputStream();
+            InputStream in = clientSocket.getInputStream();
+            // read from the random access file from a certain position with a predefined buffer size
+            // before commencing with file sending, send the size of the target file first
+            System.out.println("The file size of target file is: " + fileSize);
+            out.write(ByteBuffer.allocate(4).putInt(fileSize).array());
+            byte[] recogBuff = new byte[1000];
+            in.read(recogBuff);
+            // convert recognition byte array into String
+            System.out.println("Server says: " + new String(recogBuff));
+            long pos = 0;
+            while(pos < fileSize){
+                // initialize the byte array that will be returned from reading the random access file
+                byte[] bytesToRead = new byte[1000];
+                targetFile.seek(pos);
+                targetFile.read(bytesToRead);
+                // write the bytes array read from the random access file
+                out.write(bytesToRead);
+                pos += 1000;
+            }
+            System.out.println("File transfer point is reached");
+            // remember to close the random access file after the transfer is complete
+            targetFile.close();
+
+        }
+        catch(UnknownHostException e){
+            System.out.println("Client Host: " + e.getMessage());
+        }
+        catch(IOException e){
+            e.printStackTrace();
+        }finally {
+            // close the client socket after everything is complete
+            if(clientSocket != null){
+                try{
+                    clientSocket.close();
+                }
+                catch(IOException e){
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+
+}
diff --git a/src/main/java/Server/Connection.java b/src/main/java/Server/Connection.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef75b930c144a4c49c10aa8d0c9b972e1d0a8a65
--- /dev/null
+++ b/src/main/java/Server/Connection.java
@@ -0,0 +1,63 @@
+package Server;
+
+import java.nio.ByteBuffer;
+import java.net.*;
+import java.io.*;
+
+
+public class Connection extends Thread{
+    // how does the server save the bytes of the file read bit by bit?
+    InputStream in;
+    OutputStream out;
+    Socket clientSocket;
+    public Connection(Socket clientSocket){
+        try{
+            this.clientSocket = clientSocket;
+            in = clientSocket.getInputStream();
+            out = clientSocket.getOutputStream();
+            this.start();
+        }
+        catch(IOException e){
+            e.printStackTrace();
+        }
+    }
+    public void run(){
+        // since the file is to be transferred from client to server, we should create a new file with
+        // the same filename
+        try{
+            File newFile = new File("/home/jiahueic/Downloads/pic1transferred.jpg");
+            boolean created = newFile.createNewFile();
+            System.out.println("The new file is created: " + created);
+            RandomAccessFile fileTransferred = new RandomAccessFile(newFile,"rw");
+            // receive the filesize from the client
+            byte[] fileSizeInput = new byte[4];
+            in.read(fileSizeInput);
+            // need to send recognition to client that filesize is received
+            String recogMess = "Filesize received";
+            out.write(recogMess.getBytes());
+            int targetFileSize = ByteBuffer.wrap(fileSizeInput).getInt();
+            System.out.println("Target file size is: " + targetFileSize);
+            long pos = 0;
+            while(pos < targetFileSize){
+                // initialise a buffer array to store the data obtained from input stream
+                byte[] bufferInput = new byte[1000];
+                in.read(bufferInput);
+                // write the bufferInput into the RandomAccessFile
+                fileTransferred.seek(pos);
+                fileTransferred.write(bufferInput);
+                pos += 1000;
+            }
+            // remember to close the fileTransferred after writing everything
+            fileTransferred.close();
+            // server needs to tell client that the file is received
+            String finalMess = "Target file successfully transferred";
+            out.write(finalMess.getBytes());
+
+        }
+        catch(IOException e){
+            e.printStackTrace();
+        }
+
+
+    }
+}
diff --git a/src/main/java/Server/Server.java b/src/main/java/Server/Server.java
new file mode 100644
index 0000000000000000000000000000000000000000..a13b279c38cf9dda80a7a4648a88584c5b231077
--- /dev/null
+++ b/src/main/java/Server/Server.java
@@ -0,0 +1,25 @@
+package Server;
+import java.net.*;
+import java.io.*;
+public class Server {
+    public static void main(String[] args) {
+        try{
+            ServerSocket serverSocket = new ServerSocket(4333);
+            int i = 0;
+           while(true){
+               System.out.println("Server listening on: " + serverSocket.getInetAddress() + ":" + serverSocket.getLocalPort());
+               Socket client = serverSocket.accept();
+               // establish new Connection
+               Connection c = new Connection(client);
+               i++;
+               System.out.println("Received connection " + i + " from"+client.getInetAddress()+":"+client.getPort());
+
+           }
+        }
+        catch(IOException e){
+            e.printStackTrace();
+        }
+
+
+    }
+}
diff --git a/src/pic1.jpg b/src/pic1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4b86b6cfad16b8dd577589b91b3b59f45f1fc689
Binary files /dev/null and b/src/pic1.jpg differ