Skip to content

Commit

Permalink
Add guiao 7
Browse files Browse the repository at this point in the history
  • Loading branch information
mrmikept committed Jan 4, 2024
1 parent 1fbd2a4 commit 29f0a9c
Show file tree
Hide file tree
Showing 5 changed files with 280 additions and 0 deletions.
48 changes: 48 additions & 0 deletions Guião7/G7/src/Client.java
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();
}
}
84 changes: 84 additions & 0 deletions Guião7/G7/src/Contact.java
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();
}

}
30 changes: 30 additions & 0 deletions Guião7/G7/src/ContactList.java
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;
}

}
5 changes: 5 additions & 0 deletions Guião7/G7/src/Main.java
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!");
}
}
113 changes: 113 additions & 0 deletions Guião7/G7/src/Server.java
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();
}
}

}

0 comments on commit 29f0a9c

Please sign in to comment.