The SQLite database is on the Solaris Unis server
oit2.scps.nyu.edu.
The Android app is a client.
When the app wants to read or write a record,
it talks to a Perl program on the server.
MainActivity.java
activity_main.xml
consists of a
RelativeLayout
containing a
ScrollView
containing a
TextView.
The
ScrollView
lets the
TextView
scroll.
strings.xml
AndroidManifest.xml
has
uses-permission
INTERNET.
build.gradle
(Module: app).
cd /home/m/meretzkm/public_html/INFO1-CE9705/src/client
pwd
sqlite3 presidents.db
sqlite> create table presidents (
_id integer primary key autoincrement,
lastname text
);
sqlite> .schema
sqlite> insert into presidents (lastname) values ('Washington');
sqlite> insert into presidents (lastname) values ('Adams');
sqlite> insert into presidents (lastname) values ('Jefferson');
sqlite> .dump
sqlite> .quit
chmod 600 presidents.db
ls -l presidents.db
The server is bound to TCP port 3000.
#!/bin/perl
#To launch this server on oit2.scps.nyu.edu and bind it to TCP port number 3000,
#/home/m/meretzkm/public_html/INFO1-CE9705/src/client/server.pl &
use strict;
use Socket;
use IO::Socket;
#Simple HTTP server in Perl, connected to an SQLite database.
my $database_file =
'/home/m/meretzkm/public_html/INFO1-CE9705/src/client/presidents.db';
#Create a hash named %data containing the key/value pairs in the query string.
sub parse_form {
my $data = $_[0];
my %data;
foreach (split /&/, $data) {
my ($key, $val) = split /=/;
$val =~ s/\+/ /g;
$val =~ s/%(..)/chr(hex($1))/eg;
$data{$key} = $val;
print(" $key = $data{$key}\n");
}
return %data;
}
#Create a socket with which the server can listen for clients.
my $server = new IO::Socket::INET(
Proto => 'tcp',
LocalPort => 3000, #TCP port number I'm allowed to use on oit2.scps.nyu.edu
Listen => SOMAXCONN,
Reuse => 1);
$server or die "Unable to create server socket: $!" ;
# Await requests and handle them as they arrive
while (my $client = $server->accept()) {
my $peer_address = $client->peerhost();
print("Server accepted a connection from client $peer_address.\n");
$client->autoflush(1);
my %request = ();
my %data;
{
#Read the client's request.
local $/ = Socket::CRLF;
while (<$client>) {
chomp;
print("Server read the line $_\n");
if (/\s*(GET)\s*([^\s]+)\s*HTTP\/(\d\.\d)/) {
$request{METHOD} = uc $1;
$request{URL} = $2;
$request{HTTP_VERSION} = $3;
}
elsif (/\s*(PUT)\s*([^\s]+)\s*/) {
$request{METHOD} = uc $1;
$request{URL} = $2;
}
elsif (/:/) {
(my $type, my $val) = split /:/, $_, 2;
$type =~ s/^\s+//;
foreach ($type, $val) {
s/^\s+//;
s/\s+$//;
}
$request{lc $type} = $val;
} # POST data
elsif (/^$/) {
read($client, $request{CONTENT}, $request{'content-length'})
if defined $request{'content-length'};
last;
}
}
}
#If the URL contained a query string,
if ($request{URL} =~ /(.*)\?(.*)/) {
$request{URL} = $1;
$request{CONTENT} = $2;
%data = parse_form($request{CONTENT});
} else {
%data = ();
}
if ($request{METHOD} eq 'GET') {
# Send Response
print $client "HTTP/1.0 200 OK", Socket::CRLF;
print $client "Content-type: text/plain", Socket::CRLF;
print $client Socket::CRLF;
my $select_statement = "select lastname from presidents where _id = $data{_id};";
my $lastname = `sqlite3 $database_file '$select_statement'`;
chomp $lastname;
print $client $lastname;
$data{'_status'} = '200';
}
elsif ($request{METHOD} eq 'PUT') {
my $update_statement =
"update presidents set lastname = \"$data{lastname}\" where _id = $data{_id};";
system("sqlite3 $database_file '$update_statement'");
}
close $client; #Close the server's connection to the client.
print("\n");
}
cd /home/m/meretzkm/public_html/INFO1-CE9705/src/client
server.pl &
netstat -a -f inet -P tcp
TCP: IPv4
Local Address Remote Address Swind Send-Q Rwind Recv-Q State
-------------------- -------------------- ----- ------ ----- ------ -----------
i5.ssh ool-182f45a8.dyn.optonline.net.37059 262140 0 128480 0 ESTABLISHED
i5.ssh 1172-08-OSX.FILMTV.TSOA.NYU.EDU.49414 131008 0 128872 0 ESTABLISHED
*.ssh *.* 0 0 128000 0 LISTEN
i5.ssh cpe-66-108-91-251.nyc.res.rr.com.64972 131008 0 128872 0 ESTABLISHED
*.smtp *.* 0 0 128000 0 LISTEN
*.80 *.* 0 0 128000 0 LISTEN
*.* *.* 0 0 128000 0 IDLE
*.sunrpc *.* 0 0 128000 0 LISTEN
*.* *.* 0 0 128000 0 IDLE
*.sunrpc *.* 0 0 128000 0 LISTEN
*.* *.* 0 0 128000 0 IDLE
i5.ssh cpe-66-108-91-251.nyc.res.rr.com.64799 131008 0 128872 0 ESTABLISHED
*.3000 *.* 0 0 128000 0 LISTEN
i5.80 RECON.ES.ITS.NYU.EDU.45847 28288 0 128592 0 TIME_WAIT
*.3306 *.* 0 0 128000 0 LISTEN
*.5666 *.* 0 0 128000 0 LISTEN
jobs [1] - Running server.pl & kill %1 jobs
http://oit2.scps.nyu.edu:3000/?_id=3
Jefferson
telnet oit2.scps.nyu.edu 3000 Trying 128.122.109.53... Connected to oit2.scps.nyu.edu. Escape character is '^]'. GET ?_id=3 HTTP/1.0 (Press Return twice.) JeffersonConnection closed by foreign host.
telnet oit2.scps.nyu.edu 3000 Trying 128.122.109.53... Connected to oit2.scps.nyu.edu. Escape character is '^]'. PUT ?_id=3&lastname=Geoffrey HTTP/1.0 (Press Return twice.)
Server accepted a connection from client 66.108.91.251. Server read the line GET /?_id=1 HTTP/1.1 Server read the line User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Samsung Galaxy S5 - 4.4.4 - API 19 - 1080x1920 Build/KTU84P) Server read the line Host: oit2.scps.nyu.edu:3000 Server read the line Connection: Keep-Alive Server read the line Accept-Encoding: gzip Server read the line _id = 1 Server accepted a connection from client 66.108.91.251. Server read the line GET /?_id=2 HTTP/1.1 Server read the line User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Samsung Galaxy S5 - 4.4.4 - API 19 - 1080x1920 Build/KTU84P) Server read the line Host: oit2.scps.nyu.edu:3000 Server read the line Connection: Keep-Alive Server read the line Accept-Encoding: gzip Server read the line _id = 2 Server accepted a connection from client 66.108.91.251. Server read the line GET /?_id=3 HTTP/1.1 Server read the line User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Samsung Galaxy S5 - 4.4.4 - API 19 - 1080x1920 Build/KTU84P) Server read the line Host: oit2.scps.nyu.edu:3000 Server read the line Connection: Keep-Alive Server read the line Accept-Encoding: gzip Server read the line _id = 3 Server accepted a connection from client 66.108.91.251. Server read the line PUT /?_id=3&lastname=Jeff HTTP/1.1 Server read the line User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Samsung Galaxy S5 - 4.4.4 - API 19 - 1080x1920 Build/KTU84P) Server read the line Host: oit2.scps.nyu.edu:3000 Server read the line Connection: Keep-Alive Server read the line Accept-Encoding: gzip Server read the line Content-Type: application/x-www-form-urlencoded Server read the line Content-Length: 0 Server read the line _id = 3 lastname = Jeff Server accepted a connection from client 66.108.91.251. Server read the line GET /?_id=1 HTTP/1.1 Server read the line User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Samsung Galaxy S5 - 4.4.4 - API 19 - 1080x1920 Build/KTU84P) Server read the line Host: oit2.scps.nyu.edu:3000 Server read the line Connection: Keep-Alive Server read the line Accept-Encoding: gzip Server read the line _id = 1 Server accepted a connection from client 66.108.91.251. Server read the line GET /?_id=2 HTTP/1.1 Server read the line User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Samsung Galaxy S5 - 4.4.4 - API 19 - 1080x1920 Build/KTU84P) Server read the line Host: oit2.scps.nyu.edu:3000 Server read the line Connection: Keep-Alive Server read the line Accept-Encoding: gzip Server read the line _id = 2 Server accepted a connection from client 66.108.91.251. Server read the line GET /?_id=3 HTTP/1.1 Server read the line User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Samsung Galaxy S5 - 4.4.4 - API 19 - 1080x1920 Build/KTU84P) Server read the line Host: oit2.scps.nyu.edu:3000 Server read the line Connection: Keep-Alive Server read the line Accept-Encoding: gzip Server read the line _id = 3