The Single Most Important Thing You Can Do
is to begin your implementation immediately. 
										
											The earlier you begin your implementation, the greater chances you have of
											actually finishing the project.
										
is to begin your implementation immediately. 
										
											The earlier you begin your implementation, the greater chances you have of
											actually finishing the project.
										
src/common folder.common package, ALWAYS push the associated submodule FIRST, then push the main assignment repo!src, named netid1_netid2, where netid1 is
									the netID of the team lead (add a netid3 if there is a 3rd person on the team). ALL YOUR CHATAPP IMPLEMENTATION CODE WILL GO
									IN HERE.
								module-info.java file has the necessary entries. See the latest information in Canvas for the current requirements! provided.utils.view package provides convenience classes that make it easy to create tabbed UIs with exactly the functionality needed for this assignment.netid1_netid2 package
									that will contain the components for a chatroom mini-MVC. Set up a mini-mvc in
									those packages. The important differences between a mini-MVC and a normal MVC are
									
									The simple answer is: anything that deals with network communication.
									In practice, it's a little more complex than that - the API does have to
									define exactly what's sent across the network and how it's sent, but it
									also needs to define expected behaviors and processes. 
									For example, the API could specify that no user can disconnect from the
									network without notifying everyone else of their departure.
								
									A well-known message is simply one that, right out of the box, 
									everyone using your API will have to implement. For example, if an
									IStringMessage is defined as a well-known type, that means that
									everyone has to implement their own command to support it. Nobody on the
									network should ever have to request/send the command that processes it. 
									
								
									In terms of the Visitor Design Pattern, a datapacket is a host and
									the extended visitor is, well, the visitor. Fundamentally, this means
									that when you receive a datapacket, all you need to do to process it is
									call: 
									datapacket.execute(visitor)
									Delving a little more into specifics, the visitor is like a container for
									commands. Each command 'installed' in the visitor handles a specific
									case, or type, of input. In this case, each command will handle a
									different message type from the datapacket. 
									A command is just an algorithm that processes a message in
									some way.
								       	
								
| Remote Objects | Stubs | Serializable Objects | 
|---|---|---|
| Cannot be sent across the network | Can be sent across the network | Can be sent across the network | 
| Exist as a standalone object | Created from and dependent on remote objects | Exist as a standalone object | 
| Can do their own processing | Cannot do their own processing - call back to the original remote object to do processing for them | Can do their own processing | 
| Synchronous | Asynchronous | 
|---|---|
| Sender waits for a response from the receiver | Sender does not wait for a response from the receiver | 
| Generally non-void return types | Generally void return type | 
| Sending and receiving requests/commands usually not done on different threads | Sending and receiving requests/commands must be done on different threads |