Week 2
Week 2
Due Dates & Links
- Quiz 2 (will be released after class Monday) - Due 11:59am (just before noon) Wednesday October 5, 2022
Lecture Materials
- Monday Lecture Handout (Google Slides)
- Monday Lecture Handout (PDF)
- Wednesday Lecture Handout (Google Slides)
- Wednesday Lecture Handout (PDF)
Notes from class
Links to Podcast
Note: Links will require you to log in as a UCSD student
Lab Tasks
As usual, you can read ahead and are encouraged to prepare! Keep in mind that the lab isn’t guaranteed to be final until the day of the lab, and a lot of the exercises are collaborative, so you can’t truly “finish it ahead of time”.
Today we’ll use some of what we learned about URLS to create a web server.
The URLHandler
Interface
There’s a lot that web servers can do. We will start with a small fragment of their behavior that is enough to do interesting work. For now we’ll focus on programs that take a URL as input and respond with the text of a web page. We’ll call the part of the program that does this processing a URLHandler
:
interface URLHandler {
String processRequest(URI uri);
}
We’ll also use a class that takes a URLHandler
and starts up the server that listens for incoming connections.
class Server {
static void start(int port, URLHandler handler) { ... }
}
(Note that it says URI
, not URL
. There isn’t a meaningful difference between these concepts for our purposes, and all the URIs we work with are also URLs. Java has good documentation on URI. We’ll discuss what a port
is below.).
We’ve provided an implementation of a web server that works with this interface here:
https://github.com/ucsd-cse15l-f22/wavelet
Everyone in your group should make a fork of this repository.
The fork button is on the upper right:
This makes a copy of the repository on in your Github account. Then, clone the repository that you forked (not the original!) using Github Desktop, and open it in Visual Studio Code.
There are two files in this repository:
Server.java
– we wrote this and you can treat it as a “black box”, without understanding its details for today. Of course, you’re welcome to read it and ask questions about it, but we might defer your questions to Piazza, office hours, or later to focus on the work specific to this lab.NumberServer.java
– this is a program with amain
method that creates aURLHandler
that manages a single number, and usesServer.java
to start a web server using that handler.
Write down in notes: Read through the code in NumberServer.java
. What do you think each line does? What questions do you have? Discuss these with other groups. It’s OK to have open questions at this point! Many will be resolved by the next few sections.
Building and Running the Server
You can build and run the server on your local computer using these two commands, from the working directory of the clone of the repository. It should look like this when it works:
⤇ javac Server.java NumberServer.java
⤇ java NumberServer 4000
Server Started! Visit http://localhost:4000
Then, in a browser on your computer, open http://localhost:4000. You should see something that looks like this:
There are a few definitions worth discussing here:
Ports: The
4000
above identifies a specific port that the web server runs on. This is an extra part of a URL that’s often used in development;4000
isn’t special and you could pick others – you’re welcome to try a few in the thousands; it won’t break anything. Sites on the public web actually use a port as well, either80
or443
, but your browser hides it from you because it’s the default. You’re welcome to read about these details, but they aren’t necessary to learn the relevant stuff in this lab.Localhost: The
localhost
domain refers to the computer you’re on. So rather than going out over the internet to send the URL to a particular domain somewhere else, this page is being handled by the running Java program on your computer, which we say is “listening” on localhost at port 4000. That work is what’s done inServer.java
and by Java’sHTTPServer
library.
It’s also worth pointing out that the terminal will just sit there without letting you type more commands while the server is running: it is in an infinite loop waiting for the next URL request to come in! You can stop the server by pressing Ctrl-c (this works for any terminal command that’s in an infinite loop).
Try out URLs with paths and queries on the running server as described in NumberServer.java
. Based on the code, what paths and query combinations do you think will have interesting effects? Try them out!
Write down in notes – show a screenshot of trying each of the paths that provide a response based on your reading of NumberServer.java
. There should be 4: the root path, one for incrementing, one for adding by a specific count, and one that shows an error.
Run the Server on a Remote Computer
Next, copy the program to your account on ieng6
and run it, using strategies from last week’s lab. Feel free to ask your lab tutor for help doing this, and there might even be strategies that you can find as a group that make it easier to get the code onto the server! However you do it, make note of how you copied, built, and ran the code.
Note that there are only 3 ieng6 computers, which presents a problem – each one only has one port 4000
. If multiple people try to use the same port at the same time on the same computer, there will be an error:
[cs15lfa22@ieng6-202]:wavelet:123$ java NumberServer 4000
Exception in thread "main" java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:461)
at sun.nio.ch.Net.bind(Net.java:453)
So you can’t all use port 4000
. If you want something unique for this lab you can use 5000
+ the number of the machine you’re sitting in front of if in room B260, and 6000
+ that number if in room B270. Or experiment!
The cool thing about running it on these computers is you can access it from other computers! After starting the server, you can load your web page from other places! For example, if you’re on ieng6-201.ucsd.edu
running on port 1234, you can open http://ieng6-201.ucsd.edu:1234
from another computer in the lab or your laptop to see the output of the running server. Neat – you’ve deployed a web server!
Write down in notes Take some screenshots of loading your web server running on ieng6
, and the commands you used to copy it over and run it. Did people have different strategies?
Write down in notes Brainstorm a little bit. Now that you have the ability to make a web server, what are some ideas for other applications you could create? Think about things you could plausibly build with your knowledge of Java plus this server interface. What else might you need to go further?
Make the Simplest “Search Engine”
Make a new file called SearchEngine.java
. In it, implement a web server (like NumberServer.java
) that tracks a list of strings. It should support a path for adding a new string to the list, and a path for querying the list of strings and returning a list of all strings that have a given substring.
Examples of paths/queries:
/add?s=anewstringtoadd
/add?s=pineapple
/add?s=apple
/search?s=app
(would return pineapple and apple)
When you’ve done this (and even if you don’t finish), push a copy of your new server to your Github repository; we will use it and improve on it in future labs.
Before you leave the lab, head to the assignment “Lab2 Participation” on Gradescope and complete it. It only has one question and is not going to take more than a minute. This assignment will be used to award you participation credit for this lab. Please note that you will be receiving full credit for participation only if you have attended the lab in-person and actively engaged in discussions with your group.