Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Seventh Assignment: Socket Programming

Table of contents

Important Note:

When you're opening this project on your own system, please make sure to:

  1. Go to Settings/Preferences > Build, Execution, Deployment > Build Tools > Gradle.

  2. Under Gradle settings, change the Gradle distribution to:

  • Use local Gradle distribution, and

  • Set the Gradle home path to your own local Gradle installation directory.

If you don’t have Gradle installed locally, you can either:

  • Install Gradle manually and configure the path, or

  • Change the setting to Use Gradle wrapper instead.

Introduction

Welcome to the Seventh Advanced Programming (AP) Assignment. This project is divided into two main sections:

  1. Theoretical Questions: This section is designed to deepen your understanding of networking concepts in Java. You'll have to analyze one code block and answer questions about it.

  2. Practical Questions: In this section, you'll get hands-on experience with socket-programming in Java.

Objectives 🎯

  • Reviewing the concepts of socket programming

  • Creating a local server to handle incoming client requests

  • Enabling clients to send messages in a group chat or download files from the server

  • Designing a request-response mechanism for communication between client and server

Theoretical Questions 📝

Note: Please answer these questions in a Markdown file (Report.md) and place it in the root directory of your fork. Include code or screenshots where you see fit.

1. Three Ways to Send a Login Message

classLoginRequestimplementsSerializable {
Stringusername;
Stringpassword;
LoginRequest(Stringusername, Stringpassword) {
this.username = username;
this.password = password;
}
}
publicclassClient {
publicstaticvoidmain(String[] args) throwsException {
Socketsocket = newSocket("localhost", 5050);
LoginRequestloginRequest = newLoginRequest("user1", "pass123");
// === Method 1: Plain String ===PrintWriterstringOut = newPrintWriter(socket.getOutputStream(), true);
stringOut.println("LOGIN|" + loginRequest.username + "|" + loginRequest.password);
// === Method 2: Serialized Object ===ObjectOutputStreamobjectOut = newObjectOutputStream(socket.getOutputStream());
objectOut.writeObject(loginRequest);
// === Method 3: JSON ===Gsongson = newGson();
Stringjson = gson.toJson(loginRequest);
PrintWriterjsonOut = newPrintWriter(socket.getOutputStream(), true);
jsonOut.println(json);
socket.close();
}
}

Note: The server file is not provided as part of this project. You are encouraged to write your own server implementation for testing and running the application.

Questions:

Method 1: Plain String Format

  1. What are the pros and cons of using a plain string like "LOGIN|user|pass"?
  2. How would you parse it, and what happens if the delimiter appears in the data?
  3. Is this approach suitable for more complex or nested data?

Method 2: Serialized Java Object

  1. What’s the advantage of sending a full Java object?
  2. Could this work with a non-Java client like Python?

Method 3: JSON

  1. Why is JSON often preferred for communication between different systems?
  2. Would this format work with servers or clients written in other languages?

Practical Questions 💻

Chat

📝 Task Description

In this task, you will complete the functionality for a basic command-line chat application. The application allows multiple users to join a shared chat room, send messages to each other, and receive messages in real time. Your work involves both the client-side and server-side logic needed to support live message exchange and communication flow.

🛠 What You Need to Do

  • Implement the logic for reading and processing incoming messages on the server side.
  • Handle message sending from the server to an individual client.
  • Broadcast messages from one user to all other users in the chat.
  • Ensure that the server updates its list of connected clients properly when a client disconnects.
  • On the client side, implement the functionality to listen for and display new messages from the server.
  • Start the client-side message receiver when a user enters the chat.
  • Enable sending a message from the client to the server when the user types in the chat.
  • Implement the exit mechanism so that when a user types /exit, the client disconnects cleanly from the chat.

File Upload / Download

📝 Task Description

The application allows clients to upload files from their local directory to the server and download files stored on the server to their local folder. Each client has their own folder under resources/Client/<username>.

🛠 What You Need to Do

Upload
  • Let the user select a file from resources/Client/<username>.
  • Send file metadata (name and length) to the server to indicate an upload is starting.
  • Read the file as bytes and send it over the socket.
  • On the server, implement receiveFile() to accept the file data and save it using saveUploadedFile().
  • Place some files in resources/Client/<username>/ for the client for testing.
Download
  • Send a file list request to the server.
  • On the server, implement sendFileList() to list and send back all files in resources/Server/.
  • Let the client select a file from the list.
  • Send a file download request from the client.
  • Implement sendFile() on the server to send the selected file and its size.
  • Receive the file on the client and save it to resources/Client/<username>/.
  • Place some files in resources/Server/ for the server for testing.

📬 About the Message Class (Optional)

The Message class defines a structured format for data exchanged between the Client and Server, such as login requests, chat messages, file operations, or other commands.

Note:
This class is not required for socket communication.
It is provided as a convenient option for structured messaging between the client and server.
You may choose to use:

  • Java serialization,

  • JSON with a library like Jackson or Gson,

  • Or your own custom protocol (e.g., delimited strings).


Bonus Tasks 🌟

Chat

Graphical Visualization (UI)

  • Implement a graphical user interface (GUI) for the chat application. The GUI should allow users to:

    • See a list of connected users.

    • Send and receive messages in real time.

    • Display chat messages in a scrolling window.

Chat History

  • Implement a chat history to show previous messages.

Evaluation 📊

Your work on this assignment will be evaluated based on:

  • Understanding of Networking Concepts: Your ability to accurately answer the theoretical questions. Remember that the answers to the theoretical questions should be provided separately in a markdown file.

  • Code Quality: Your code should be well-structured, readable, and efficient. Proper use of Java conventions, including variable naming, class structure, and comments, will also be considered.

  • 🔒 Important Constraint The Server and Client modules must not reference each other directly in code. They communicate only through sockets, not through shared classes. However, both the server and client can reference the Shared folder to use common data structures, constants, or utilities.

  • Total: 100 points

    • 🧠 Theoretical Questions – 20 points
    • 🧮 Practical Task 1 (Chat) – 40 points
    • 🏦 Practical Task 2 (File Upload Download) – 40 points
    • 🌟 Bonus Tasks – Up to 10 extra points

Submission ⌛

  1. Add your mentor as a contributor to the project.
  2. Create a develop branch for implementing features.
  3. Use Git for regular code commits.
  4. Push your code and the answers file to the remote repository.
  5. Submit a pull request to merge the develop branch with main.

The deadline for submitting your code is Wednesday, May 21 (31st of Ordibehesht)

Additional Resources 📚

For assistance with this assignment, you may refer to the following resources:

To learn about different input and output streams:

Also, you can find a wealth of knowledge from various YouTube courses. They can be a great source of learning. Alongside, joining discussions on forums and reading helpful documents can also be beneficial.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Seventh Assignment: Socket Programming

Table of contents

Important Note:

When you're opening this project on your own system, please make sure to:

  1. Go to Settings/Preferences > Build, Execution, Deployment > Build Tools > Gradle.

  2. Under Gradle settings, change the Gradle distribution to:

  • Use local Gradle distribution, and

  • Set the Gradle home path to your own local Gradle installation directory.

If you don’t have Gradle installed locally, you can either:

  • Install Gradle manually and configure the path, or

  • Change the setting to Use Gradle wrapper instead.

Introduction

Welcome to the Seventh Advanced Programming (AP) Assignment. This project is divided into two main sections:

  1. Theoretical Questions: This section is designed to deepen your understanding of networking concepts in Java. You'll have to analyze one code block and answer questions about it.

  2. Practical Questions: In this section, you'll get hands-on experience with socket-programming in Java.

Objectives 🎯

  • Reviewing the concepts of socket programming

  • Creating a local server to handle incoming client requests

  • Enabling clients to send messages in a group chat or download files from the server

  • Designing a request-response mechanism for communication between client and server

Theoretical Questions 📝

Note: Please answer these questions in a Markdown file (Report.md) and place it in the root directory of your fork. Include code or screenshots where you see fit.

1. Three Ways to Send a Login Message

classLoginRequestimplementsSerializable {
Stringusername;
Stringpassword;
LoginRequest(Stringusername, Stringpassword) {
this.username = username;
this.password = password;
}
}
publicclassClient {
publicstaticvoidmain(String[] args) throwsException {
Socketsocket = newSocket("localhost", 5050);
LoginRequestloginRequest = newLoginRequest("user1", "pass123");
// === Method 1: Plain String ===PrintWriterstringOut = newPrintWriter(socket.getOutputStream(), true);
stringOut.println("LOGIN|" + loginRequest.username + "|" + loginRequest.password);
// === Method 2: Serialized Object ===ObjectOutputStreamobjectOut = newObjectOutputStream(socket.getOutputStream());
objectOut.writeObject(loginRequest);
// === Method 3: JSON ===Gsongson = newGson();
Stringjson = gson.toJson(loginRequest);
PrintWriterjsonOut = newPrintWriter(socket.getOutputStream(), true);
jsonOut.println(json);
socket.close();
}
}

Note: The server file is not provided as part of this project. You are encouraged to write your own server implementation for testing and running the application.

Questions:

Method 1: Plain String Format

  1. What are the pros and cons of using a plain string like "LOGIN|user|pass"?
  2. How would you parse it, and what happens if the delimiter appears in the data?
  3. Is this approach suitable for more complex or nested data?

Method 2: Serialized Java Object

  1. What’s the advantage of sending a full Java object?
  2. Could this work with a non-Java client like Python?

Method 3: JSON

  1. Why is JSON often preferred for communication between different systems?
  2. Would this format work with servers or clients written in other languages?

Practical Questions 💻

Chat

📝 Task Description

In this task, you will complete the functionality for a basic command-line chat application. The application allows multiple users to join a shared chat room, send messages to each other, and receive messages in real time. Your work involves both the client-side and server-side logic needed to support live message exchange and communication flow.

🛠 What You Need to Do

  • Implement the logic for reading and processing incoming messages on the server side.
  • Handle message sending from the server to an individual client.
  • Broadcast messages from one user to all other users in the chat.
  • Ensure that the server updates its list of connected clients properly when a client disconnects.
  • On the client side, implement the functionality to listen for and display new messages from the server.
  • Start the client-side message receiver when a user enters the chat.
  • Enable sending a message from the client to the server when the user types in the chat.
  • Implement the exit mechanism so that when a user types /exit, the client disconnects cleanly from the chat.

File Upload / Download

📝 Task Description

The application allows clients to upload files from their local directory to the server and download files stored on the server to their local folder. Each client has their own folder under resources/Client/<username>.

🛠 What You Need to Do

Upload
  • Let the user select a file from resources/Client/<username>.
  • Send file metadata (name and length) to the server to indicate an upload is starting.
  • Read the file as bytes and send it over the socket.
  • On the server, implement receiveFile() to accept the file data and save it using saveUploadedFile().
  • Place some files in resources/Client/<username>/ for the client for testing.
Download
  • Send a file list request to the server.
  • On the server, implement sendFileList() to list and send back all files in resources/Server/.
  • Let the client select a file from the list.
  • Send a file download request from the client.
  • Implement sendFile() on the server to send the selected file and its size.
  • Receive the file on the client and save it to resources/Client/<username>/.
  • Place some files in resources/Server/ for the server for testing.

📬 About the Message Class (Optional)

The Message class defines a structured format for data exchanged between the Client and Server, such as login requests, chat messages, file operations, or other commands.

Note:
This class is not required for socket communication.
It is provided as a convenient option for structured messaging between the client and server.
You may choose to use:

  • Java serialization,

  • JSON with a library like Jackson or Gson,

  • Or your own custom protocol (e.g., delimited strings).


Bonus Tasks 🌟

Chat

Graphical Visualization (UI)

  • Implement a graphical user interface (GUI) for the chat application. The GUI should allow users to:

    • See a list of connected users.

    • Send and receive messages in real time.

    • Display chat messages in a scrolling window.

Chat History

  • Implement a chat history to show previous messages.

Evaluation 📊

Your work on this assignment will be evaluated based on:

  • Understanding of Networking Concepts: Your ability to accurately answer the theoretical questions. Remember that the answers to the theoretical questions should be provided separately in a markdown file.

  • Code Quality: Your code should be well-structured, readable, and efficient. Proper use of Java conventions, including variable naming, class structure, and comments, will also be considered.

  • 🔒 Important Constraint The Server and Client modules must not reference each other directly in code. They communicate only through sockets, not through shared classes. However, both the server and client can reference the Shared folder to use common data structures, constants, or utilities.

  • Total: 100 points

    • 🧠 Theoretical Questions – 20 points
    • 🧮 Practical Task 1 (Chat) – 40 points
    • 🏦 Practical Task 2 (File Upload Download) – 40 points
    • 🌟 Bonus Tasks – Up to 10 extra points

Submission ⌛

  1. Add your mentor as a contributor to the project.
  2. Create a develop branch for implementing features.
  3. Use Git for regular code commits.
  4. Push your code and the answers file to the remote repository.
  5. Submit a pull request to merge the develop branch with main.

The deadline for submitting your code is Wednesday, May 21 (31st of Ordibehesht)

Additional Resources 📚

For assistance with this assignment, you may refer to the following resources:

To learn about different input and output streams:

Also, you can find a wealth of knowledge from various YouTube courses. They can be a great source of learning. Alongside, joining discussions on forums and reading helpful documents can also be beneficial.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Seventh Assignment: Socket Programming

Table of contents

Important Note:

When you're opening this project on your own system, please make sure to:

  1. Go to Settings/Preferences > Build, Execution, Deployment > Build Tools > Gradle.

  2. Under Gradle settings, change the Gradle distribution to:

  • Use local Gradle distribution, and

  • Set the Gradle home path to your own local Gradle installation directory.

If you don’t have Gradle installed locally, you can either:

  • Install Gradle manually and configure the path, or

  • Change the setting to Use Gradle wrapper instead.

Introduction

Welcome to the Seventh Advanced Programming (AP) Assignment. This project is divided into two main sections:

  1. Theoretical Questions: This section is designed to deepen your understanding of networking concepts in Java. You'll have to analyze one code block and answer questions about it.

  2. Practical Questions: In this section, you'll get hands-on experience with socket-programming in Java.

Objectives 🎯

  • Reviewing the concepts of socket programming

  • Creating a local server to handle incoming client requests

  • Enabling clients to send messages in a group chat or download files from the server

  • Designing a request-response mechanism for communication between client and server

Theoretical Questions 📝

Note: Please answer these questions in a Markdown file (Report.md) and place it in the root directory of your fork. Include code or screenshots where you see fit.

1. Three Ways to Send a Login Message

classLoginRequestimplementsSerializable {
Stringusername;
Stringpassword;
LoginRequest(Stringusername, Stringpassword) {
this.username = username;
this.password = password;
}
}
publicclassClient {
publicstaticvoidmain(String[] args) throwsException {
Socketsocket = newSocket("localhost", 5050);
LoginRequestloginRequest = newLoginRequest("user1", "pass123");
// === Method 1: Plain String ===PrintWriterstringOut = newPrintWriter(socket.getOutputStream(), true);
stringOut.println("LOGIN|" + loginRequest.username + "|" + loginRequest.password);
// === Method 2: Serialized Object ===ObjectOutputStreamobjectOut = newObjectOutputStream(socket.getOutputStream());
objectOut.writeObject(loginRequest);
// === Method 3: JSON ===Gsongson = newGson();
Stringjson = gson.toJson(loginRequest);
PrintWriterjsonOut = newPrintWriter(socket.getOutputStream(), true);
jsonOut.println(json);
socket.close();
}
}

Note: The server file is not provided as part of this project. You are encouraged to write your own server implementation for testing and running the application.

Questions:

Method 1: Plain String Format

  1. What are the pros and cons of using a plain string like "LOGIN|user|pass"?
  2. How would you parse it, and what happens if the delimiter appears in the data?
  3. Is this approach suitable for more complex or nested data?

Method 2: Serialized Java Object

  1. What’s the advantage of sending a full Java object?
  2. Could this work with a non-Java client like Python?

Method 3: JSON

  1. Why is JSON often preferred for communication between different systems?
  2. Would this format work with servers or clients written in other languages?

Practical Questions 💻

Chat

📝 Task Description

In this task, you will complete the functionality for a basic command-line chat application. The application allows multiple users to join a shared chat room, send messages to each other, and receive messages in real time. Your work involves both the client-side and server-side logic needed to support live message exchange and communication flow.

🛠 What You Need to Do

  • Implement the logic for reading and processing incoming messages on the server side.
  • Handle message sending from the server to an individual client.
  • Broadcast messages from one user to all other users in the chat.
  • Ensure that the server updates its list of connected clients properly when a client disconnects.
  • On the client side, implement the functionality to listen for and display new messages from the server.
  • Start the client-side message receiver when a user enters the chat.
  • Enable sending a message from the client to the server when the user types in the chat.
  • Implement the exit mechanism so that when a user types /exit, the client disconnects cleanly from the chat.

File Upload / Download

📝 Task Description

The application allows clients to upload files from their local directory to the server and download files stored on the server to their local folder. Each client has their own folder under resources/Client/<username>.

🛠 What You Need to Do

Upload
  • Let the user select a file from resources/Client/<username>.
  • Send file metadata (name and length) to the server to indicate an upload is starting.
  • Read the file as bytes and send it over the socket.
  • On the server, implement receiveFile() to accept the file data and save it using saveUploadedFile().
  • Place some files in resources/Client/<username>/ for the client for testing.
Download
  • Send a file list request to the server.
  • On the server, implement sendFileList() to list and send back all files in resources/Server/.
  • Let the client select a file from the list.
  • Send a file download request from the client.
  • Implement sendFile() on the server to send the selected file and its size.
  • Receive the file on the client and save it to resources/Client/<username>/.
  • Place some files in resources/Server/ for the server for testing.

📬 About the Message Class (Optional)

The Message class defines a structured format for data exchanged between the Client and Server, such as login requests, chat messages, file operations, or other commands.

Note:
This class is not required for socket communication.
It is provided as a convenient option for structured messaging between the client and server.
You may choose to use:

  • Java serialization,

  • JSON with a library like Jackson or Gson,

  • Or your own custom protocol (e.g., delimited strings).


Bonus Tasks 🌟

Chat

Graphical Visualization (UI)

  • Implement a graphical user interface (GUI) for the chat application. The GUI should allow users to:

    • See a list of connected users.

    • Send and receive messages in real time.

    • Display chat messages in a scrolling window.

Chat History

  • Implement a chat history to show previous messages.

Evaluation 📊

Your work on this assignment will be evaluated based on:

  • Understanding of Networking Concepts: Your ability to accurately answer the theoretical questions. Remember that the answers to the theoretical questions should be provided separately in a markdown file.

  • Code Quality: Your code should be well-structured, readable, and efficient. Proper use of Java conventions, including variable naming, class structure, and comments, will also be considered.

  • 🔒 Important Constraint The Server and Client modules must not reference each other directly in code. They communicate only through sockets, not through shared classes. However, both the server and client can reference the Shared folder to use common data structures, constants, or utilities.

  • Total: 100 points

    • 🧠 Theoretical Questions – 20 points
    • 🧮 Practical Task 1 (Chat) – 40 points
    • 🏦 Practical Task 2 (File Upload Download) – 40 points
    • 🌟 Bonus Tasks – Up to 10 extra points

Submission ⌛

  1. Add your mentor as a contributor to the project.
  2. Create a develop branch for implementing features.
  3. Use Git for regular code commits.
  4. Push your code and the answers file to the remote repository.
  5. Submit a pull request to merge the develop branch with main.

The deadline for submitting your code is Wednesday, May 21 (31st of Ordibehesht)

Additional Resources 📚

For assistance with this assignment, you may refer to the following resources:

To learn about different input and output streams:

Also, you can find a wealth of knowledge from various YouTube courses. They can be a great source of learning. Alongside, joining discussions on forums and reading helpful documents can also be beneficial.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Seventh Assignment: Socket Programming

Table of contents

Important Note:

When you're opening this project on your own system, please make sure to:

  1. Go to Settings/Preferences > Build, Execution, Deployment > Build Tools > Gradle.

  2. Under Gradle settings, change the Gradle distribution to:

  • Use local Gradle distribution, and

  • Set the Gradle home path to your own local Gradle installation directory.

If you don’t have Gradle installed locally, you can either:

  • Install Gradle manually and configure the path, or

  • Change the setting to Use Gradle wrapper instead.

Introduction

Welcome to the Seventh Advanced Programming (AP) Assignment. This project is divided into two main sections:

  1. Theoretical Questions: This section is designed to deepen your understanding of networking concepts in Java. You'll have to analyze one code block and answer questions about it.

  2. Practical Questions: In this section, you'll get hands-on experience with socket-programming in Java.

Objectives 🎯

  • Reviewing the concepts of socket programming

  • Creating a local server to handle incoming client requests

  • Enabling clients to send messages in a group chat or download files from the server

  • Designing a request-response mechanism for communication between client and server

Theoretical Questions 📝

Note: Please answer these questions in a Markdown file (Report.md) and place it in the root directory of your fork. Include code or screenshots where you see fit.

1. Three Ways to Send a Login Message

classLoginRequestimplementsSerializable {
Stringusername;
Stringpassword;
LoginRequest(Stringusername, Stringpassword) {
this.username = username;
this.password = password;
}
}
publicclassClient {
publicstaticvoidmain(String[] args) throwsException {
Socketsocket = newSocket("localhost", 5050);
LoginRequestloginRequest = newLoginRequest("user1", "pass123");
// === Method 1: Plain String ===PrintWriterstringOut = newPrintWriter(socket.getOutputStream(), true);
stringOut.println("LOGIN|" + loginRequest.username + "|" + loginRequest.password);
// === Method 2: Serialized Object ===ObjectOutputStreamobjectOut = newObjectOutputStream(socket.getOutputStream());
objectOut.writeObject(loginRequest);
// === Method 3: JSON ===Gsongson = newGson();
Stringjson = gson.toJson(loginRequest);
PrintWriterjsonOut = newPrintWriter(socket.getOutputStream(), true);
jsonOut.println(json);
socket.close();
}
}

Note: The server file is not provided as part of this project. You are encouraged to write your own server implementation for testing and running the application.

Questions:

Method 1: Plain String Format

  1. What are the pros and cons of using a plain string like "LOGIN|user|pass"?
  2. How would you parse it, and what happens if the delimiter appears in the data?
  3. Is this approach suitable for more complex or nested data?

Method 2: Serialized Java Object

  1. What’s the advantage of sending a full Java object?
  2. Could this work with a non-Java client like Python?

Method 3: JSON

  1. Why is JSON often preferred for communication between different systems?
  2. Would this format work with servers or clients written in other languages?

Practical Questions 💻

Chat

📝 Task Description

In this task, you will complete the functionality for a basic command-line chat application. The application allows multiple users to join a shared chat room, send messages to each other, and receive messages in real time. Your work involves both the client-side and server-side logic needed to support live message exchange and communication flow.

🛠 What You Need to Do

  • Implement the logic for reading and processing incoming messages on the server side.
  • Handle message sending from the server to an individual client.
  • Broadcast messages from one user to all other users in the chat.
  • Ensure that the server updates its list of connected clients properly when a client disconnects.
  • On the client side, implement the functionality to listen for and display new messages from the server.
  • Start the client-side message receiver when a user enters the chat.
  • Enable sending a message from the client to the server when the user types in the chat.
  • Implement the exit mechanism so that when a user types /exit, the client disconnects cleanly from the chat.

File Upload / Download

📝 Task Description

The application allows clients to upload files from their local directory to the server and download files stored on the server to their local folder. Each client has their own folder under resources/Client/<username>.

🛠 What You Need to Do

Upload
  • Let the user select a file from resources/Client/<username>.
  • Send file metadata (name and length) to the server to indicate an upload is starting.
  • Read the file as bytes and send it over the socket.
  • On the server, implement receiveFile() to accept the file data and save it using saveUploadedFile().
  • Place some files in resources/Client/<username>/ for the client for testing.
Download
  • Send a file list request to the server.
  • On the server, implement sendFileList() to list and send back all files in resources/Server/.
  • Let the client select a file from the list.
  • Send a file download request from the client.
  • Implement sendFile() on the server to send the selected file and its size.
  • Receive the file on the client and save it to resources/Client/<username>/.
  • Place some files in resources/Server/ for the server for testing.

📬 About the Message Class (Optional)

The Message class defines a structured format for data exchanged between the Client and Server, such as login requests, chat messages, file operations, or other commands.

Note:
This class is not required for socket communication.
It is provided as a convenient option for structured messaging between the client and server.
You may choose to use:

  • Java serialization,

  • JSON with a library like Jackson or Gson,

  • Or your own custom protocol (e.g., delimited strings).


Bonus Tasks 🌟

Chat

Graphical Visualization (UI)

  • Implement a graphical user interface (GUI) for the chat application. The GUI should allow users to:

    • See a list of connected users.

    • Send and receive messages in real time.

    • Display chat messages in a scrolling window.

Chat History

  • Implement a chat history to show previous messages.

Evaluation 📊

Your work on this assignment will be evaluated based on:

  • Understanding of Networking Concepts: Your ability to accurately answer the theoretical questions. Remember that the answers to the theoretical questions should be provided separately in a markdown file.

  • Code Quality: Your code should be well-structured, readable, and efficient. Proper use of Java conventions, including variable naming, class structure, and comments, will also be considered.

  • 🔒 Important Constraint The Server and Client modules must not reference each other directly in code. They communicate only through sockets, not through shared classes. However, both the server and client can reference the Shared folder to use common data structures, constants, or utilities.

  • Total: 100 points

    • 🧠 Theoretical Questions – 20 points
    • 🧮 Practical Task 1 (Chat) – 40 points
    • 🏦 Practical Task 2 (File Upload Download) – 40 points
    • 🌟 Bonus Tasks – Up to 10 extra points

Submission ⌛

  1. Add your mentor as a contributor to the project.
  2. Create a develop branch for implementing features.
  3. Use Git for regular code commits.
  4. Push your code and the answers file to the remote repository.
  5. Submit a pull request to merge the develop branch with main.

The deadline for submitting your code is Wednesday, May 21 (31st of Ordibehesht)

Additional Resources 📚

For assistance with this assignment, you may refer to the following resources:

To learn about different input and output streams:

Also, you can find a wealth of knowledge from various YouTube courses. They can be a great source of learning. Alongside, joining discussions on forums and reading helpful documents can also be beneficial.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Seventh Assignment: Socket Programming

Table of contents

Important Note:

When you're opening this project on your own system, please make sure to:

  1. Go to Settings/Preferences > Build, Execution, Deployment > Build Tools > Gradle.

  2. Under Gradle settings, change the Gradle distribution to:

  • Use local Gradle distribution, and

  • Set the Gradle home path to your own local Gradle installation directory.

If you don’t have Gradle installed locally, you can either:

  • Install Gradle manually and configure the path, or

  • Change the setting to Use Gradle wrapper instead.

Introduction

Welcome to the Seventh Advanced Programming (AP) Assignment. This project is divided into two main sections:

  1. Theoretical Questions: This section is designed to deepen your understanding of networking concepts in Java. You'll have to analyze one code block and answer questions about it.

  2. Practical Questions: In this section, you'll get hands-on experience with socket-programming in Java.

Objectives 🎯

  • Reviewing the concepts of socket programming

  • Creating a local server to handle incoming client requests

  • Enabling clients to send messages in a group chat or download files from the server

  • Designing a request-response mechanism for communication between client and server

Theoretical Questions 📝

Note: Please answer these questions in a Markdown file (Report.md) and place it in the root directory of your fork. Include code or screenshots where you see fit.

1. Three Ways to Send a Login Message

classLoginRequestimplementsSerializable {
Stringusername;
Stringpassword;
LoginRequest(Stringusername, Stringpassword) {
this.username = username;
this.password = password;
}
}
publicclassClient {
publicstaticvoidmain(String[] args) throwsException {
Socketsocket = newSocket("localhost", 5050);
LoginRequestloginRequest = newLoginRequest("user1", "pass123");
// === Method 1: Plain String ===PrintWriterstringOut = newPrintWriter(socket.getOutputStream(), true);
stringOut.println("LOGIN|" + loginRequest.username + "|" + loginRequest.password);
// === Method 2: Serialized Object ===ObjectOutputStreamobjectOut = newObjectOutputStream(socket.getOutputStream());
objectOut.writeObject(loginRequest);
// === Method 3: JSON ===Gsongson = newGson();
Stringjson = gson.toJson(loginRequest);
PrintWriterjsonOut = newPrintWriter(socket.getOutputStream(), true);
jsonOut.println(json);
socket.close();
}
}

Note: The server file is not provided as part of this project. You are encouraged to write your own server implementation for testing and running the application.

Questions:

Method 1: Plain String Format

  1. What are the pros and cons of using a plain string like "LOGIN|user|pass"?
  2. How would you parse it, and what happens if the delimiter appears in the data?
  3. Is this approach suitable for more complex or nested data?

Method 2: Serialized Java Object

  1. What’s the advantage of sending a full Java object?
  2. Could this work with a non-Java client like Python?

Method 3: JSON

  1. Why is JSON often preferred for communication between different systems?
  2. Would this format work with servers or clients written in other languages?

Practical Questions 💻

Chat

📝 Task Description

In this task, you will complete the functionality for a basic command-line chat application. The application allows multiple users to join a shared chat room, send messages to each other, and receive messages in real time. Your work involves both the client-side and server-side logic needed to support live message exchange and communication flow.

🛠 What You Need to Do

  • Implement the logic for reading and processing incoming messages on the server side.
  • Handle message sending from the server to an individual client.
  • Broadcast messages from one user to all other users in the chat.
  • Ensure that the server updates its list of connected clients properly when a client disconnects.
  • On the client side, implement the functionality to listen for and display new messages from the server.
  • Start the client-side message receiver when a user enters the chat.
  • Enable sending a message from the client to the server when the user types in the chat.
  • Implement the exit mechanism so that when a user types /exit, the client disconnects cleanly from the chat.

File Upload / Download

📝 Task Description

The application allows clients to upload files from their local directory to the server and download files stored on the server to their local folder. Each client has their own folder under resources/Client/<username>.

🛠 What You Need to Do

Upload
  • Let the user select a file from resources/Client/<username>.
  • Send file metadata (name and length) to the server to indicate an upload is starting.
  • Read the file as bytes and send it over the socket.
  • On the server, implement receiveFile() to accept the file data and save it using saveUploadedFile().
  • Place some files in resources/Client/<username>/ for the client for testing.
Download
  • Send a file list request to the server.
  • On the server, implement sendFileList() to list and send back all files in resources/Server/.
  • Let the client select a file from the list.
  • Send a file download request from the client.
  • Implement sendFile() on the server to send the selected file and its size.
  • Receive the file on the client and save it to resources/Client/<username>/.
  • Place some files in resources/Server/ for the server for testing.

📬 About the Message Class (Optional)

The Message class defines a structured format for data exchanged between the Client and Server, such as login requests, chat messages, file operations, or other commands.

Note:
This class is not required for socket communication.
It is provided as a convenient option for structured messaging between the client and server.
You may choose to use:

  • Java serialization,

  • JSON with a library like Jackson or Gson,

  • Or your own custom protocol (e.g., delimited strings).


Bonus Tasks 🌟

Chat

Graphical Visualization (UI)

  • Implement a graphical user interface (GUI) for the chat application. The GUI should allow users to:

    • See a list of connected users.

    • Send and receive messages in real time.

    • Display chat messages in a scrolling window.

Chat History

  • Implement a chat history to show previous messages.

Evaluation 📊

Your work on this assignment will be evaluated based on:

  • Understanding of Networking Concepts: Your ability to accurately answer the theoretical questions. Remember that the answers to the theoretical questions should be provided separately in a markdown file.

  • Code Quality: Your code should be well-structured, readable, and efficient. Proper use of Java conventions, including variable naming, class structure, and comments, will also be considered.

  • 🔒 Important Constraint The Server and Client modules must not reference each other directly in code. They communicate only through sockets, not through shared classes. However, both the server and client can reference the Shared folder to use common data structures, constants, or utilities.

  • Total: 100 points

    • 🧠 Theoretical Questions – 20 points
    • 🧮 Practical Task 1 (Chat) – 40 points
    • 🏦 Practical Task 2 (File Upload Download) – 40 points
    • 🌟 Bonus Tasks – Up to 10 extra points

Submission ⌛

  1. Add your mentor as a contributor to the project.
  2. Create a develop branch for implementing features.
  3. Use Git for regular code commits.
  4. Push your code and the answers file to the remote repository.
  5. Submit a pull request to merge the develop branch with main.

The deadline for submitting your code is Wednesday, May 21 (31st of Ordibehesht)

Additional Resources 📚

For assistance with this assignment, you may refer to the following resources:

To learn about different input and output streams:

Also, you can find a wealth of knowledge from various YouTube courses. They can be a great source of learning. Alongside, joining discussions on forums and reading helpful documents can also be beneficial.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Seventh Assignment: Socket Programming

Table of contents

Important Note:

When you're opening this project on your own system, please make sure to:

  1. Go to Settings/Preferences > Build, Execution, Deployment > Build Tools > Gradle.

  2. Under Gradle settings, change the Gradle distribution to:

  • Use local Gradle distribution, and

  • Set the Gradle home path to your own local Gradle installation directory.

If you don’t have Gradle installed locally, you can either:

  • Install Gradle manually and configure the path, or

  • Change the setting to Use Gradle wrapper instead.

Introduction

Welcome to the Seventh Advanced Programming (AP) Assignment. This project is divided into two main sections:

  1. Theoretical Questions: This section is designed to deepen your understanding of networking concepts in Java. You'll have to analyze one code block and answer questions about it.

  2. Practical Questions: In this section, you'll get hands-on experience with socket-programming in Java.

Objectives 🎯

  • Reviewing the concepts of socket programming

  • Creating a local server to handle incoming client requests

  • Enabling clients to send messages in a group chat or download files from the server

  • Designing a request-response mechanism for communication between client and server

Theoretical Questions 📝

Note: Please answer these questions in a Markdown file (Report.md) and place it in the root directory of your fork. Include code or screenshots where you see fit.

1. Three Ways to Send a Login Message

classLoginRequestimplementsSerializable {
Stringusername;
Stringpassword;
LoginRequest(Stringusername, Stringpassword) {
this.username = username;
this.password = password;
}
}
publicclassClient {
publicstaticvoidmain(String[] args) throwsException {
Socketsocket = newSocket("localhost", 5050);
LoginRequestloginRequest = newLoginRequest("user1", "pass123");
// === Method 1: Plain String ===PrintWriterstringOut = newPrintWriter(socket.getOutputStream(), true);
stringOut.println("LOGIN|" + loginRequest.username + "|" + loginRequest.password);
// === Method 2: Serialized Object ===ObjectOutputStreamobjectOut = newObjectOutputStream(socket.getOutputStream());
objectOut.writeObject(loginRequest);
// === Method 3: JSON ===Gsongson = newGson();
Stringjson = gson.toJson(loginRequest);
PrintWriterjsonOut = newPrintWriter(socket.getOutputStream(), true);
jsonOut.println(json);
socket.close();
}
}

Note: The server file is not provided as part of this project. You are encouraged to write your own server implementation for testing and running the application.

Questions:

Method 1: Plain String Format

  1. What are the pros and cons of using a plain string like "LOGIN|user|pass"?
  2. How would you parse it, and what happens if the delimiter appears in the data?
  3. Is this approach suitable for more complex or nested data?

Method 2: Serialized Java Object

  1. What’s the advantage of sending a full Java object?
  2. Could this work with a non-Java client like Python?

Method 3: JSON

  1. Why is JSON often preferred for communication between different systems?
  2. Would this format work with servers or clients written in other languages?

Practical Questions 💻

Chat

📝 Task Description

In this task, you will complete the functionality for a basic command-line chat application. The application allows multiple users to join a shared chat room, send messages to each other, and receive messages in real time. Your work involves both the client-side and server-side logic needed to support live message exchange and communication flow.

🛠 What You Need to Do

  • Implement the logic for reading and processing incoming messages on the server side.
  • Handle message sending from the server to an individual client.
  • Broadcast messages from one user to all other users in the chat.
  • Ensure that the server updates its list of connected clients properly when a client disconnects.
  • On the client side, implement the functionality to listen for and display new messages from the server.
  • Start the client-side message receiver when a user enters the chat.
  • Enable sending a message from the client to the server when the user types in the chat.
  • Implement the exit mechanism so that when a user types /exit, the client disconnects cleanly from the chat.

File Upload / Download

📝 Task Description

The application allows clients to upload files from their local directory to the server and download files stored on the server to their local folder. Each client has their own folder under resources/Client/<username>.

🛠 What You Need to Do

Upload
  • Let the user select a file from resources/Client/<username>.
  • Send file metadata (name and length) to the server to indicate an upload is starting.
  • Read the file as bytes and send it over the socket.
  • On the server, implement receiveFile() to accept the file data and save it using saveUploadedFile().
  • Place some files in resources/Client/<username>/ for the client for testing.
Download
  • Send a file list request to the server.
  • On the server, implement sendFileList() to list and send back all files in resources/Server/.
  • Let the client select a file from the list.
  • Send a file download request from the client.
  • Implement sendFile() on the server to send the selected file and its size.
  • Receive the file on the client and save it to resources/Client/<username>/.
  • Place some files in resources/Server/ for the server for testing.

📬 About the Message Class (Optional)

The Message class defines a structured format for data exchanged between the Client and Server, such as login requests, chat messages, file operations, or other commands.

Note:
This class is not required for socket communication.
It is provided as a convenient option for structured messaging between the client and server.
You may choose to use:

  • Java serialization,

  • JSON with a library like Jackson or Gson,

  • Or your own custom protocol (e.g., delimited strings).


Bonus Tasks 🌟

Chat

Graphical Visualization (UI)

  • Implement a graphical user interface (GUI) for the chat application. The GUI should allow users to:

    • See a list of connected users.

    • Send and receive messages in real time.

    • Display chat messages in a scrolling window.

Chat History

  • Implement a chat history to show previous messages.

Evaluation 📊

Your work on this assignment will be evaluated based on:

  • Understanding of Networking Concepts: Your ability to accurately answer the theoretical questions. Remember that the answers to the theoretical questions should be provided separately in a markdown file.

  • Code Quality: Your code should be well-structured, readable, and efficient. Proper use of Java conventions, including variable naming, class structure, and comments, will also be considered.

  • 🔒 Important Constraint The Server and Client modules must not reference each other directly in code. They communicate only through sockets, not through shared classes. However, both the server and client can reference the Shared folder to use common data structures, constants, or utilities.

  • Total: 100 points

    • 🧠 Theoretical Questions – 20 points
    • 🧮 Practical Task 1 (Chat) – 40 points
    • 🏦 Practical Task 2 (File Upload Download) – 40 points
    • 🌟 Bonus Tasks – Up to 10 extra points

Submission ⌛

  1. Add your mentor as a contributor to the project.
  2. Create a develop branch for implementing features.
  3. Use Git for regular code commits.
  4. Push your code and the answers file to the remote repository.
  5. Submit a pull request to merge the develop branch with main.

The deadline for submitting your code is Wednesday, May 21 (31st of Ordibehesht)

Additional Resources 📚

For assistance with this assignment, you may refer to the following resources:

To learn about different input and output streams:

Also, you can find a wealth of knowledge from various YouTube courses. They can be a great source of learning. Alongside, joining discussions on forums and reading helpful documents can also be beneficial.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Seventh Assignment: Socket Programming

Table of contents

Important Note:

When you're opening this project on your own system, please make sure to:

  1. Go to Settings/Preferences > Build, Execution, Deployment > Build Tools > Gradle.

  2. Under Gradle settings, change the Gradle distribution to:

  • Use local Gradle distribution, and

  • Set the Gradle home path to your own local Gradle installation directory.

If you don’t have Gradle installed locally, you can either:

  • Install Gradle manually and configure the path, or

  • Change the setting to Use Gradle wrapper instead.

Introduction

Welcome to the Seventh Advanced Programming (AP) Assignment. This project is divided into two main sections:

  1. Theoretical Questions: This section is designed to deepen your understanding of networking concepts in Java. You'll have to analyze one code block and answer questions about it.

  2. Practical Questions: In this section, you'll get hands-on experience with socket-programming in Java.

Objectives 🎯

  • Reviewing the concepts of socket programming

  • Creating a local server to handle incoming client requests

  • Enabling clients to send messages in a group chat or download files from the server

  • Designing a request-response mechanism for communication between client and server

Theoretical Questions 📝

Note: Please answer these questions in a Markdown file (Report.md) and place it in the root directory of your fork. Include code or screenshots where you see fit.

1. Three Ways to Send a Login Message

classLoginRequestimplementsSerializable {
Stringusername;
Stringpassword;
LoginRequest(Stringusername, Stringpassword) {
this.username = username;
this.password = password;
}
}
publicclassClient {
publicstaticvoidmain(String[] args) throwsException {
Socketsocket = newSocket("localhost", 5050);
LoginRequestloginRequest = newLoginRequest("user1", "pass123");
// === Method 1: Plain String ===PrintWriterstringOut = newPrintWriter(socket.getOutputStream(), true);
stringOut.println("LOGIN|" + loginRequest.username + "|" + loginRequest.password);
// === Method 2: Serialized Object ===ObjectOutputStreamobjectOut = newObjectOutputStream(socket.getOutputStream());
objectOut.writeObject(loginRequest);
// === Method 3: JSON ===Gsongson = newGson();
Stringjson = gson.toJson(loginRequest);
PrintWriterjsonOut = newPrintWriter(socket.getOutputStream(), true);
jsonOut.println(json);
socket.close();
}
}

Note: The server file is not provided as part of this project. You are encouraged to write your own server implementation for testing and running the application.

Questions:

Method 1: Plain String Format

  1. What are the pros and cons of using a plain string like "LOGIN|user|pass"?
  2. How would you parse it, and what happens if the delimiter appears in the data?
  3. Is this approach suitable for more complex or nested data?

Method 2: Serialized Java Object

  1. What’s the advantage of sending a full Java object?
  2. Could this work with a non-Java client like Python?

Method 3: JSON

  1. Why is JSON often preferred for communication between different systems?
  2. Would this format work with servers or clients written in other languages?

Practical Questions 💻

Chat

📝 Task Description

In this task, you will complete the functionality for a basic command-line chat application. The application allows multiple users to join a shared chat room, send messages to each other, and receive messages in real time. Your work involves both the client-side and server-side logic needed to support live message exchange and communication flow.

🛠 What You Need to Do

  • Implement the logic for reading and processing incoming messages on the server side.
  • Handle message sending from the server to an individual client.
  • Broadcast messages from one user to all other users in the chat.
  • Ensure that the server updates its list of connected clients properly when a client disconnects.
  • On the client side, implement the functionality to listen for and display new messages from the server.
  • Start the client-side message receiver when a user enters the chat.
  • Enable sending a message from the client to the server when the user types in the chat.
  • Implement the exit mechanism so that when a user types /exit, the client disconnects cleanly from the chat.

File Upload / Download

📝 Task Description

The application allows clients to upload files from their local directory to the server and download files stored on the server to their local folder. Each client has their own folder under resources/Client/<username>.

🛠 What You Need to Do

Upload
  • Let the user select a file from resources/Client/<username>.
  • Send file metadata (name and length) to the server to indicate an upload is starting.
  • Read the file as bytes and send it over the socket.
  • On the server, implement receiveFile() to accept the file data and save it using saveUploadedFile().
  • Place some files in resources/Client/<username>/ for the client for testing.
Download
  • Send a file list request to the server.
  • On the server, implement sendFileList() to list and send back all files in resources/Server/.
  • Let the client select a file from the list.
  • Send a file download request from the client.
  • Implement sendFile() on the server to send the selected file and its size.
  • Receive the file on the client and save it to resources/Client/<username>/.
  • Place some files in resources/Server/ for the server for testing.

📬 About the Message Class (Optional)

The Message class defines a structured format for data exchanged between the Client and Server, such as login requests, chat messages, file operations, or other commands.

Note:
This class is not required for socket communication.
It is provided as a convenient option for structured messaging between the client and server.
You may choose to use:

  • Java serialization,

  • JSON with a library like Jackson or Gson,

  • Or your own custom protocol (e.g., delimited strings).


Bonus Tasks 🌟

Chat

Graphical Visualization (UI)

  • Implement a graphical user interface (GUI) for the chat application. The GUI should allow users to:

    • See a list of connected users.

    • Send and receive messages in real time.

    • Display chat messages in a scrolling window.

Chat History

  • Implement a chat history to show previous messages.

Evaluation 📊

Your work on this assignment will be evaluated based on:

  • Understanding of Networking Concepts: Your ability to accurately answer the theoretical questions. Remember that the answers to the theoretical questions should be provided separately in a markdown file.

  • Code Quality: Your code should be well-structured, readable, and efficient. Proper use of Java conventions, including variable naming, class structure, and comments, will also be considered.

  • 🔒 Important Constraint The Server and Client modules must not reference each other directly in code. They communicate only through sockets, not through shared classes. However, both the server and client can reference the Shared folder to use common data structures, constants, or utilities.

  • Total: 100 points

    • 🧠 Theoretical Questions – 20 points
    • 🧮 Practical Task 1 (Chat) – 40 points
    • 🏦 Practical Task 2 (File Upload Download) – 40 points
    • 🌟 Bonus Tasks – Up to 10 extra points

Submission ⌛

  1. Add your mentor as a contributor to the project.
  2. Create a develop branch for implementing features.
  3. Use Git for regular code commits.
  4. Push your code and the answers file to the remote repository.
  5. Submit a pull request to merge the develop branch with main.

The deadline for submitting your code is Wednesday, May 21 (31st of Ordibehesht)

Additional Resources 📚

For assistance with this assignment, you may refer to the following resources:

To learn about different input and output streams:

Also, you can find a wealth of knowledge from various YouTube courses. They can be a great source of learning. Alongside, joining discussions on forums and reading helpful documents can also be beneficial.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Seventh Assignment: Socket Programming

Table of contents

Important Note:

When you're opening this project on your own system, please make sure to:

  1. Go to Settings/Preferences > Build, Execution, Deployment > Build Tools > Gradle.

  2. Under Gradle settings, change the Gradle distribution to:

  • Use local Gradle distribution, and

  • Set the Gradle home path to your own local Gradle installation directory.

If you don’t have Gradle installed locally, you can either:

  • Install Gradle manually and configure the path, or

  • Change the setting to Use Gradle wrapper instead.

Introduction

Welcome to the Seventh Advanced Programming (AP) Assignment. This project is divided into two main sections:

  1. Theoretical Questions: This section is designed to deepen your understanding of networking concepts in Java. You'll have to analyze one code block and answer questions about it.

  2. Practical Questions: In this section, you'll get hands-on experience with socket-programming in Java.

Objectives 🎯

  • Reviewing the concepts of socket programming

  • Creating a local server to handle incoming client requests

  • Enabling clients to send messages in a group chat or download files from the server

  • Designing a request-response mechanism for communication between client and server

Theoretical Questions 📝

Note: Please answer these questions in a Markdown file (Report.md) and place it in the root directory of your fork. Include code or screenshots where you see fit.

1. Three Ways to Send a Login Message

classLoginRequestimplementsSerializable {
Stringusername;
Stringpassword;
LoginRequest(Stringusername, Stringpassword) {
this.username = username;
this.password = password;
}
}
publicclassClient {
publicstaticvoidmain(String[] args) throwsException {
Socketsocket = newSocket("localhost", 5050);
LoginRequestloginRequest = newLoginRequest("user1", "pass123");
// === Method 1: Plain String ===PrintWriterstringOut = newPrintWriter(socket.getOutputStream(), true);
stringOut.println("LOGIN|" + loginRequest.username + "|" + loginRequest.password);
// === Method 2: Serialized Object ===ObjectOutputStreamobjectOut = newObjectOutputStream(socket.getOutputStream());
objectOut.writeObject(loginRequest);
// === Method 3: JSON ===Gsongson = newGson();
Stringjson = gson.toJson(loginRequest);
PrintWriterjsonOut = newPrintWriter(socket.getOutputStream(), true);
jsonOut.println(json);
socket.close();
}
}

Note: The server file is not provided as part of this project. You are encouraged to write your own server implementation for testing and running the application.

Questions:

Method 1: Plain String Format

  1. What are the pros and cons of using a plain string like "LOGIN|user|pass"?
  2. How would you parse it, and what happens if the delimiter appears in the data?
  3. Is this approach suitable for more complex or nested data?

Method 2: Serialized Java Object

  1. What’s the advantage of sending a full Java object?
  2. Could this work with a non-Java client like Python?

Method 3: JSON

  1. Why is JSON often preferred for communication between different systems?
  2. Would this format work with servers or clients written in other languages?

Practical Questions 💻

Chat

📝 Task Description

In this task, you will complete the functionality for a basic command-line chat application. The application allows multiple users to join a shared chat room, send messages to each other, and receive messages in real time. Your work involves both the client-side and server-side logic needed to support live message exchange and communication flow.

🛠 What You Need to Do

  • Implement the logic for reading and processing incoming messages on the server side.
  • Handle message sending from the server to an individual client.
  • Broadcast messages from one user to all other users in the chat.
  • Ensure that the server updates its list of connected clients properly when a client disconnects.
  • On the client side, implement the functionality to listen for and display new messages from the server.
  • Start the client-side message receiver when a user enters the chat.
  • Enable sending a message from the client to the server when the user types in the chat.
  • Implement the exit mechanism so that when a user types /exit, the client disconnects cleanly from the chat.

File Upload / Download

📝 Task Description

The application allows clients to upload files from their local directory to the server and download files stored on the server to their local folder. Each client has their own folder under resources/Client/<username>.

🛠 What You Need to Do

Upload
  • Let the user select a file from resources/Client/<username>.
  • Send file metadata (name and length) to the server to indicate an upload is starting.
  • Read the file as bytes and send it over the socket.
  • On the server, implement receiveFile() to accept the file data and save it using saveUploadedFile().
  • Place some files in resources/Client/<username>/ for the client for testing.
Download
  • Send a file list request to the server.
  • On the server, implement sendFileList() to list and send back all files in resources/Server/.
  • Let the client select a file from the list.
  • Send a file download request from the client.
  • Implement sendFile() on the server to send the selected file and its size.
  • Receive the file on the client and save it to resources/Client/<username>/.
  • Place some files in resources/Server/ for the server for testing.

📬 About the Message Class (Optional)

The Message class defines a structured format for data exchanged between the Client and Server, such as login requests, chat messages, file operations, or other commands.

Note:
This class is not required for socket communication.
It is provided as a convenient option for structured messaging between the client and server.
You may choose to use:

  • Java serialization,

  • JSON with a library like Jackson or Gson,

  • Or your own custom protocol (e.g., delimited strings).


Bonus Tasks 🌟

Chat

Graphical Visualization (UI)

  • Implement a graphical user interface (GUI) for the chat application. The GUI should allow users to:

    • See a list of connected users.

    • Send and receive messages in real time.

    • Display chat messages in a scrolling window.

Chat History

  • Implement a chat history to show previous messages.

Evaluation 📊

Your work on this assignment will be evaluated based on:

  • Understanding of Networking Concepts: Your ability to accurately answer the theoretical questions. Remember that the answers to the theoretical questions should be provided separately in a markdown file.

  • Code Quality: Your code should be well-structured, readable, and efficient. Proper use of Java conventions, including variable naming, class structure, and comments, will also be considered.

  • 🔒 Important Constraint The Server and Client modules must not reference each other directly in code. They communicate only through sockets, not through shared classes. However, both the server and client can reference the Shared folder to use common data structures, constants, or utilities.

  • Total: 100 points

    • 🧠 Theoretical Questions – 20 points
    • 🧮 Practical Task 1 (Chat) – 40 points
    • 🏦 Practical Task 2 (File Upload Download) – 40 points
    • 🌟 Bonus Tasks – Up to 10 extra points

Submission ⌛

  1. Add your mentor as a contributor to the project.
  2. Create a develop branch for implementing features.
  3. Use Git for regular code commits.
  4. Push your code and the answers file to the remote repository.
  5. Submit a pull request to merge the develop branch with main.

The deadline for submitting your code is Wednesday, May 21 (31st of Ordibehesht)

Additional Resources 📚

For assistance with this assignment, you may refer to the following resources:

To learn about different input and output streams:

Also, you can find a wealth of knowledge from various YouTube courses. They can be a great source of learning. Alongside, joining discussions on forums and reading helpful documents can also be beneficial.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages