-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
280 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
import java.io.*; | ||
import java.net.Socket; | ||
import java.util.ArrayList; | ||
import java.util.Arrays; | ||
|
||
public class Client { | ||
|
||
public static Contact parseLine(String userInput) { | ||
String[] tokens = userInput.split(" "); | ||
|
||
if (tokens[3].equals("null")) tokens[3] = null; | ||
|
||
return new Contact( | ||
tokens[0], | ||
Integer.parseInt(tokens[1]), | ||
Long.parseLong(tokens[2]), | ||
tokens[3], | ||
new ArrayList<>(Arrays.asList(tokens).subList(4, tokens.length))); | ||
} | ||
|
||
|
||
public static void main(String[] args) throws IOException { | ||
Socket socket = new Socket("localhost", 12345); | ||
|
||
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); | ||
DataInputStream input = new DataInputStream(new BufferedInputStream(socket.getInputStream())); | ||
DataOutputStream outputStream = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); | ||
|
||
ContactList list = ContactList.deserialize(input); | ||
System.out.println("#### Contact List ####"); | ||
for (Contact contact : list) | ||
{ | ||
System.out.println(contact); | ||
} | ||
|
||
System.out.println("\n#### Insert new Contacts ####\nFormat: Name Age PhoneNumber Company Emails"); | ||
|
||
String userInput; | ||
while ((userInput = in.readLine()) != null) { | ||
Contact newContact = parseLine(userInput); | ||
System.out.println("Adding new contact to list: " + newContact.toString()); | ||
newContact.serialize(outputStream); | ||
outputStream.flush(); | ||
} | ||
|
||
socket.close(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
import java.io.DataInputStream; | ||
import java.io.DataOutputStream; | ||
import java.io.IOException; | ||
import java.util.*; | ||
|
||
class Contact { | ||
private String name; | ||
private int age; | ||
private long phoneNumber; | ||
private String company; // Pode ser null | ||
private ArrayList<String> emails; | ||
|
||
public Contact(String name, int age, long phoneNumber, String company, List<String> emails) { | ||
this.name = name; | ||
this.age = age; | ||
this.phoneNumber = phoneNumber; | ||
this.company = company; | ||
this.emails = new ArrayList<>(emails); | ||
} | ||
|
||
public String name() { return name; } | ||
public int age() { return age; } | ||
public long phoneNumber() { return phoneNumber; } | ||
public String company() { return company; } | ||
public List<String> emails() { return new ArrayList(emails); } | ||
|
||
public void serialize(DataOutputStream out) throws IOException { | ||
out.writeUTF(this.name); | ||
out.writeInt(this.age); | ||
out.writeLong(this.phoneNumber); | ||
if (this.company == null) | ||
{ | ||
out.writeInt(0); | ||
} | ||
else | ||
{ | ||
out.writeInt(1); | ||
out.writeUTF(this.company); | ||
} | ||
out.writeInt(this.emails.size()); | ||
for (String email : this.emails) | ||
{ | ||
out.writeUTF(email); | ||
} | ||
} | ||
|
||
public static Contact deserialize(DataInputStream in) | ||
{ | ||
try { | ||
String name = in.readUTF(); | ||
int age = in.readInt(); | ||
long phoneNumber = in.readLong(); | ||
int flag = in.readInt(); | ||
String company = null; | ||
if (flag == 1) | ||
{ | ||
company = in.readUTF(); | ||
} | ||
int size = in.readInt(); | ||
List<String> emails = new ArrayList<>(); | ||
for (int i = 0; i < size; i++) | ||
{ | ||
emails.add(in.readUTF()); | ||
} | ||
return new Contact(name,age,phoneNumber,company,emails); | ||
} catch (IOException e) | ||
{ | ||
return null; | ||
} | ||
|
||
} | ||
|
||
public String toString() { | ||
StringBuilder builder = new StringBuilder(); | ||
builder.append(this.name).append(";"); | ||
builder.append(this.age).append(";"); | ||
builder.append(this.phoneNumber).append(";"); | ||
builder.append(this.company).append(";"); | ||
builder.append(this.emails.toString()); | ||
builder.append("}"); | ||
return builder.toString(); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import java.io.DataInputStream; | ||
import java.io.DataOutputStream; | ||
import java.io.IOException; | ||
import java.util.ArrayList; | ||
|
||
class ContactList extends ArrayList<Contact> { | ||
|
||
// @TODO | ||
public void serialize(DataOutputStream out) throws IOException | ||
{ | ||
out.writeInt(this.size()); | ||
for (Contact contact : this) | ||
{ | ||
contact.serialize(out); | ||
} | ||
} | ||
|
||
// @TODO | ||
public static ContactList deserialize(DataInputStream in) throws IOException | ||
{ | ||
ContactList list = new ContactList(); | ||
int size = in.readInt(); | ||
for (int i = 0; i < size; i++) | ||
{ | ||
list.add(Contact.deserialize(in)); | ||
} | ||
return list; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
public class Main { | ||
public static void main(String[] args) { | ||
System.out.println("Hello world!"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
import java.io.*; | ||
import java.net.ServerSocket; | ||
import java.net.Socket; | ||
import java.util.ArrayList; | ||
import java.util.Arrays; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.concurrent.locks.ReentrantLock; | ||
import java.util.stream.Collectors; | ||
|
||
import static java.util.Arrays.asList; | ||
|
||
class ContactManager { | ||
private HashMap<String, Contact> contacts = new HashMap<>(); | ||
private ReentrantLock contactLock = new ReentrantLock(); | ||
|
||
// @TODO | ||
public void update(Contact c) | ||
{ | ||
this.contactLock.lock(); | ||
try { | ||
System.out.println("New Contact: " + c.name()); | ||
this.contacts.put(c.name(),c); | ||
} finally { | ||
this.contactLock.unlock(); | ||
} | ||
} | ||
|
||
// @TODO | ||
public ContactList getContacts() | ||
{ | ||
this.contactLock.lock(); | ||
try { | ||
ContactList list = new ContactList(); | ||
for (Map.Entry<String, Contact> entry : this.contacts.entrySet()) | ||
{ | ||
list.add(entry.getValue()); | ||
} | ||
return list; | ||
} finally { | ||
this.contactLock.unlock(); | ||
} | ||
} | ||
} | ||
|
||
class ServerWorker implements Runnable { | ||
private Socket socket; | ||
private ContactManager manager; | ||
|
||
public ServerWorker(Socket socket, ContactManager manager) { | ||
this.socket = socket; | ||
this.manager = manager; | ||
} | ||
|
||
// @TODO | ||
@Override | ||
public void run() | ||
{ | ||
try { | ||
DataInputStream input = new DataInputStream(new BufferedInputStream(socket.getInputStream())); | ||
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); | ||
|
||
System.out.println("Sending contactList..."); | ||
this.manager.getContacts().serialize(output); | ||
output.flush(); | ||
|
||
System.out.println("Listening for contacts..."); | ||
while (true) | ||
{ | ||
Contact contact = Contact.deserialize(input); | ||
if (contact == null) | ||
{ | ||
break; | ||
} | ||
System.out.println("New contact found!"); | ||
this.manager.update(contact); | ||
} | ||
|
||
} catch (IOException e) { | ||
throw new RuntimeException(e); | ||
} finally { | ||
try { | ||
System.out.println("Lost connection with Client..."); | ||
socket.shutdownInput(); | ||
socket.shutdownOutput(); | ||
socket.close(); | ||
} catch (IOException e) { | ||
throw new RuntimeException(e); | ||
} | ||
} | ||
} | ||
} | ||
|
||
|
||
|
||
public class Server { | ||
|
||
public static void main (String[] args) throws IOException { | ||
ServerSocket serverSocket = new ServerSocket(12345); | ||
ContactManager manager = new ContactManager(); | ||
// example pre-population | ||
manager.update(new Contact("John", 20, 253123321, null, asList("john@mail.com"))); | ||
manager.update(new Contact("Alice", 30, 253987654, "CompanyInc.", asList("alice.personal@mail.com", "alice.business@mail.com"))); | ||
manager.update(new Contact("Bob", 40, 253123456, "Comp.Ld", asList("bob@mail.com", "bob.work@mail.com"))); | ||
|
||
while (true) { | ||
Socket socket = serverSocket.accept(); | ||
Thread worker = new Thread(new ServerWorker(socket, manager)); | ||
worker.start(); | ||
} | ||
} | ||
|
||
} |