Transcript Networking

CS4273: Distributed System Technologies and Programming I
Lecture 7: Java Networking
Web Networking in Java
Applets Send Data back to Web Servers
In many situations applets need to send data
back to the server for processing. Generally
there are two ways for applets to send data
back to their home sites (note: applets can
only communicate to their home sites):
1. Launch the application server on web site.
Applets communicate with it via sockets.
But you’re usually not allowed to launch
your server on web site.
2. Use CGI (common gateway interface). It is
well defined in HTTP protocol and most
commonly used.
App
server
2
A simple ASP example
<%@ Language = "VBScript" %>
<html><head><title >
An ASP Example
</title></head>
<body bgcolor=white>
<form name="form1" method=“POST">
<input name="TextBox1" type="text" id="TextBox1" />
<%
ss = Request.Form("TextBox1")
%>
<input name="TextBox2" type="text" id="TextBox2" value="<%= ss %>" />
<input type="submit" name="Button1" value="Button" id="Button1" />
</form>
</body></html>
3
CGI Program working with HTML forms
<html><head> <title> Order Form </title> </head>
<body>
<h1 align=center> Order Form </h1>
<form action = "http://www.cs.cityu.edu.hk/~jia/cgi/
formcgi.cgi" method=POST>
Name <input name="customer" size=47> <p>
Street Address <input name="address" size=40> <p>
Credit Card No. <input name="cardno" size=10>
Expire Date <input name="expire" size=6>
M/C <input name="cc" type=radio value="mastercard">
Visa <input name="cc" type=radio value="visacard">
Ship by express <input name="express" type=checkbox>
<input type=submit value="submit address"> <p>
</body> </html>
4
A simple example of a CGI program
main(argc, argv)
int argc; char *argv[];
{ char *data; FILE *fp;
// header: required by http protocol
printf("Content-type: text/plain\n");
printf("\n");
scanf("%s", data); // read from browser
// write data to a file
fp = fopen("form.dat", "w+");
fprintf(fp, "%s\n", data);
Web Server
browser
HTML
form
// send reply back to browser
printf(“Your order is processed. Thanks!\n);
HTTP
server
CGI
}
5
Data format of HTML forms
Data collected from the form is sent back to the web server as a
single line of string, where fields are separated by “&”, space
are replaced by “+” and other symbols by %ASCII code:
customer=Xiaohua+Jia&address=CS+dept%2C+City+U+of+
HK&cardno=12345667&expire=01%2F97&cc=visacard&ex
press=on
6
CGI Program for HTML forms
•
•
•
•
cgi programs can be developed in any language. After being
compiled, name the executable file with the extension “.cgi”.
put the cgi program in the same directory as the webpage (it
can be in other dir, but you need specify correctly in the form).
This program will be started by the HTTP server when a
client clicks “submit” button of the form.
The cgi program reads the form data from the stdin and its
stdout has been redirected to the client browser.
It processes the form data and sends replies back to the web
browser (the replies is usually in HTML format, so that the
browser can display the response nicely).
7
Applets Communicate with CGI Programs
•
•
applets can take inputs from the user, send request to and recv replies from a
cgi program via the web server using HTTP protocol.
applets open a socket connecting back to the originating HTTP server. Then
they use “POST” method to send data to the cgi program:
out.println("POST "+ "/~jia /cgi/appletcgi.cgi HTTP/1.0");
out.println("Content-type: plain/text");
out.println("Content-length: " + data.length());
out.println("");
// header ends with “\r”
out.println(data); // data must be packed into one line
•
•
•
http server strips the header from the packet received from applets and passes
only the data to cgi program.
cgi program (in the same format as that for HTML forms) receives data from
applets through stdin and sends replies back through stdout.
cgi program is started by HTTP server each time when an applet POSTs data.
8
Example of Applet Interacts With CGI Program
public class appletCGI extends Applet implements
ActionListener {
public void init() {
……………..
add("North", textin = new JtextField("“, 50));
textin.addActionListener(this);
sourceArea = new TextArea(30, 80);
}
public void public void actionPerformed
(ActionEvent e) {
String sdata = textin.getText(); // no space in data!!!
if (e.getSource() == textin) {
s = new Socket("personal.cs.cityu.edu.hk",80);
in = new BufferedReader(new
InputStreamReader(s.getInputStream()));
out = new PrintWriter(s.getOutputStream(), true);
// one run of this protocol sends one line str
out.println("POST /~jia/cgi/appletcgi.cgi
HTTP/1.0");
out.println("Content-type: plain/text");
out.println("Content-length: " +
sdata.length());
out.println("");
out.println(sdata );
while ((line = in.readLine()) != null)
sourceArea.append(line+"\n");
out.close(); in.close();}
………
}
………
9
An “Echo” CGI program with Applet
main(argc, argv)
int argc; char *argv[];
{ char sdata[256], rdata[256]; FILE *fp;
printf("Content-type: text/plain\n");
printf("\n");
fp = fopen("form.dat", "a"); // append mode
scanf("%s\r", rdata);
fprintf(fp, "%s\n", rdata); // save to file
printf(“Echoed from CGI: %s\n", rdata);
fclose (fp);
}
10
What A CGI Program Can Do
After a CGI program is started by the http server, it receives data
from applets (or HTML forms). It processes users inputs by:
– connect to database servers to retrieve client requested data (convert client
query into database query commands),
– save the processed data to a local file, or
– connect to mail servers to send emails to users for data processing.
Note: CGI is an ordinary application server. It can communicate with
any servers running anywhere.
CGI is a gateway to bridge applets
to the outside of the world!
11
Implementation of Email Order
• CGI program can request a mail server to send the data received
from an applet (or HTML form) to an email-account as an email.
• CGI program interacts with the mail server via SMTP (simple mail
transfer protocol) to send an email. Applet can’t access mail server
directly due to security reason.
• SMTP is an ASCII text protocol. You can find the format of
SMTP commands by using “telnet” to connect to an email server.
Important: telnet is a great debugging
tool for Internet programming!!!
12
Implementation of Email Order (Cont.)
class mailOrder {
public static void main(String[] args ) {
boolean more = true;
String str = null;
s = new Socket("mars.cs.cityu.edu.hk",25);
in = new BufferedReader(
new InputStreamReader(s.getInputStream()));
out = new PrintWriter(s.getOutputStream(), true);
str = in.readLine(); // read reply from svr
System.out.println(str); // for debug
// followings are SMTP commands
out.println("HELO ss4e.cs.ust.hk\r" );
str = in.readLine(); // read reply from svr
System.out.println(str);
out.println("MAIL FROM: jcao\r" );
…… // read reply from mail svr
out.println("RCPT TO: [email protected]\r" );
…… // read reply from mail svr
out.println( "DATA\r" );
// start of data
……
out.println( "this is 2nd test!\r" ); // email body
……
out.println( ".\r" ); // end of email body
……
out.println( "QUIT\r" ); // quit SMTP
……
}
…….
}
13
CGI program in Java
Since the above cgi program (mailOrder) is written in Java
and a Java program needs the Java interpreter to execute it,
a cgi shell script is needed to execute the Java code:
#!/bin/sh
echo Content-type: text/plain
echo
/usr/local/jdk/bin/java mailOrder
echo $QUERY_STRING
14