A Finalll Project Report On
-
Upload
vijay-krishan-yadav -
Category
Documents
-
view
219 -
download
0
Transcript of A Finalll Project Report On
-
8/6/2019 A Finalll Project Report On
1/68
A Project Report On
HTTP CACHING PROXY SERVER
Submitted in partial fulfillment of the requirements
for the degree of
Bachelor of Technology
In
Computer Science and Technology
Under the guidance of: Submitted By:
Mr. D.L. Gupta 1. Ranvijai Singh
0710410042
2. Vijay Krisha Yadav
0710410057
Department Of Computer Science and Engineering
Kamla Nehru Institute of Technology
Sultanpur-228118 (India)
Gautam Buddha Technical University, Lucknow
1 | P a g e
-
8/6/2019 A Finalll Project Report On
2/68
Certificate
This is to certify that the project report entitled
HTTP CACHING PROXY SERVER submitted in partial fulfillment of the
requirements for the degree of Bachelor of the Technology in Computer
Science and Engineering done by Mr. Ranvijai Singh, Roll No. 0710410042
and Mr. Vijay Krishan Yadav, Roll No. 0710410057 is an authentic work
carried out by him at Department of Computer Science and Engineering under
my guidance. The matter embodied in this project has not been submitted earlier
for the award of any degree or diploma to the best of my knowledge and belief.
Date: Signature of the Guide
Mr. D.L. Gupta
Astt. Professor
Comp. Sc. & Engg. Department
Kamla Nehru Institute of Tech.
Mr. D.L. Gupta Dr. A.K. Malviya
Project Guide Project Incharge
Mr. Sameer Srivastava
Head of Department Of ComputerScience and Engineering
Kamla Nehru Institute of Technology
Sultanpur-228118 (India)
2 | P a g e
-
8/6/2019 A Finalll Project Report On
3/68
ACKNOWLEDGEMENT
My foremost and profound gratitude goes to Mr. D.L. Gupta for his
proficient and enthusiastic guidance and encouragement. The suggestions given
undoubtedly helped in supplementing my thoughts in the right direction for
attaining the desired objective.
My heartfelt gratitude also goes to all the faculty members and Staff of
Kamla Nehru Institute of Technology, Gautam Buddha Technical University
who have contributed directly or indirectly towards the successful completion of
this report.
Ranvijai Singh(0710410042)
Vijay Krishan Yadav(0710410057)
3 | P a g e
-
8/6/2019 A Finalll Project Report On
4/68
Content and order of the Project report:
1) Introduction6
3.1 Objective
3.2 Scope
3.3 Motivation
3.4 Problem Definition
3.5 Technologies Used
3.6 Organization of the Report
2) Background
3) Project Description
3.1 SRS.1. Product Perspective
2. User Interfaces
3. Hardware Requirements of User
4. Software Requirements of User
5. Operations
6. Product Functions
7. User Characteristics
8. Constrains
3.2 Software System Attributes
1. Security
2. Quality
3. Measurement
3.3 Features
3.4 Disadvantage of the Current System
3.5 Advantage of the Proposed System
4) Project Design and Implementation..
4.1) Feasibility Study
4.2) Data Flow Diagram
4.3) Use Case Diagram4.4) Development Schedule(Gantt Chart)
4.5) EER Diagram
4.6) Implementation
4.7) Code
4.8) Testing
4.9)Experimental Setup
4 | P a g e
-
8/6/2019 A Finalll Project Report On
5/68
5) Project Output
6) Conclusion and Future Scope
a) Conclusion
b) Future Scope
Appendix
a) Coding
b) Gontt Chart
c) EER Diagram
d) Test Cases
Bibliography
5 | P a g e
-
8/6/2019 A Finalll Project Report On
6/68
INTRODUCTION
1.1 OBJECTIVE:
An HTTP proxy server is a server that handles HTTP requests from clients. If the
clients are of a common organization or domain, or exhibit a similarity in
browsing behavior, the proxy can effectively cache requested documents.
Caching, which migrates documents across the network closer to the users, reduces
network traffic, reduces the load on popular Web servers and reduces the time that
end users wait for documents to load.
1.2 SCOPE:
Caching proxies keep local copies of frequently requested resources, allowing large
organizations to significantly reduce their upstream bandwidth usage and cost, while
significantly increasing performance.
A caching proxy server accelerates service requests by retrieving content saved from
a previous request made by the same client or even other clients.
6 | P a g e
-
8/6/2019 A Finalll Project Report On
7/68
1.3 MOTIVATION:
A proxy server accepts requests from clients. When possible and desired, it
generates replies based upon documents stored in its local cache; otherwise, it
forewords the requests, transfers the replies to the clients and caches them when
possible.
The proxy thus acts both as a server and as a client. It is a server when accepting
HTTP requests from its clients, but a client to the remote servers it connects to
when it is unable to fulfill requests by the means of its local cache.
1.4 PROBLEM DEFINITION:
Administrator can monitor activities of various users like which kind of web
pages are visited by any particular users.
This project is a step ahead process to solve the various problems we face in
day to day life while surfing through college network.
It provides web pages from its cache instead of the original web page which
saves a lot of money and time.
1.5 TECHNOLOGIES USED:
Netbeans IDE 6.5 for java programming.
JDK 1.6 .
Socket programming.
7 | P a g e
-
8/6/2019 A Finalll Project Report On
8/68
1.6 ORGANIZATION OF THE REPORT:This report is organized in the six chapters and few appendix:
INTRODUCTION gives a brief introduction about the project. It consist of Objective, Scope,Motivation, Problem Definition and Technology Used as the sub headings which completely
summarizes about the whole project.
BACKGROUND gives a few details about the various technologies used in this project and
also explains in brief about the functioning of the various technologies.
PROJECT DESCRIPTION includes the software requirement specification (SRS) documentof the project and describes about the various features of the project. It also includes the
disadvantages of the previous system and advantages of the proposed system.
PROJECT DESIGN & IMPLEMENTATION describes about the various designing phasesthat the project undergoes such as Gantt chart and data flow diagram. Also includes the
documentation of them and the testing of the various modules incorporated within the project.
PROJECT OUTPUT includes the snapshots of the various screens that the project shows
while running in the real time.
FUTURE SCOPE & CONCLUSION gives the direction about the enhancement of the project
in various dimensions and also concludes the project report.
APPENDIX: It has three parts. Part A consists of , the code of few modules that is in the
project. Part B consists of the development schedule of the whole project described by theGantt Chart. And Part C includes the Entity Relationship Diagram (ERD) that is used for theproject. And the last part D includes the Test Case of the project
8 | P a g e
-
8/6/2019 A Finalll Project Report On
9/68
2. BACKGROUND:
The most obvious compromise is to provide a single host with Internet access for all your
users. However, this isn't a satisfactory solution because these hosts aren't transparent to users.
Users who want to access network services can't do so directly. They have to log in to thedual-homed host, do all their work from there, and then somehow transfer the results of their
work back to their own workstations. At best, this multiple-step process annoys users byforcing them to do multiple transfers and work without the customizations they're accustomed
to.
The problem is worse at sites with multiple operating systems; if your native system is a
Macintosh, and the dual-homed host is a UNIX system, the UNIX system will probably becompletely foreign to you. You'll be limited to using whatever tools are available on the dual-
homed host, and these tools may be completely unlike (and may seem inferior to) the tools
you use on your own system.
Dual-homed hosts configured without proxies therefore tend to annoy their users andsignificantly reduce the benefit people get from the Internet connection. Worse, they usually
don't provide adequate security; it's almost impossible to adequately secure a machine with
many users, particularly when those users are explicitly trying to get to the external universe.
You can't effectively limit the available tools, because your users can always transfer toolsfrom internal machines that are the same type. For example, on a dual-homed host you can't
guarantee that all file transfers will be logged because people can use their own file transfer
agents that don't do logging.
Proxy systems avoid user frustration and the insecurities of a dual-homed host. They dealwith user frustration by automating the interaction with the dual-homed host. Instead of
requiring users to deal directly with the dual-homed host, proxy systems allow all interaction
to take place behind the scenes. The user has the illusion he is dealing directly (or almostdirectly) with the server on the Internet that he really wants to access, with a minimum of
direct interaction with the dual-homed host.
9 | P a g e
-
8/6/2019 A Finalll Project Report On
10/68
3. PROJECT DESCRIPTION:
3.1. SRS:
1. Product Perspective:
Product is designed to solve the problems regarding use of internet services and speed related
with bandwidth and to enhance surfing facility and minimize load from server .
2. USER INTERFACES:
User interface of the product is interactive and easily understandable by the user.
3. HARDWARE REQUIREMENT FOR USER:
* Intel 486 or higher. RISC support shoul be available.
* 24 MB Ram for Intel chips and 32 MB Ram for RISC.
* 10 MB for installation.100 MB + .5 MB per client for Cache space.
* 2 Network interfaces (Adapters, Dial-Up, etc)
4. SOFTWARE REQUIREMENT FOR USER:
* Windows NT server 4.0
* Internet Information Server 2.0
* Service Pack 3
* TCP/IP
5. OPERATIONS:
A cache/proxy server network conserves bandwidth, decreases network-
imposed latency, and offsets the load on the origin server from which the
content is published. Network bandwidth is minimized because only one
10 | P a g e
-
8/6/2019 A Finalll Project Report On
11/68
connection from the origin server is required to upload content to and
receive information from remote cache/proxy servers on the network.
Latency is decreased because a client can receive content from a nearby
cache/proxy server more quickly than it could if it had to traverse the
network or the Internet to receive content from the origin server.
Additionally, the load on the origin server is offset because fewer clients
are connecting directly to it. These three factors result in a better viewing
experience for users and operating cost reduction.
6. PRODUCT FUNCTIONS:
Caching
Reduces Latency
Reduces traffic on the web
Bandwidth Conservation
Increases accessibility
Firewalling and filtering
Connection sharing
7. USER CHARACTERISTICS:
8. CONSTRAINS:
The existing physical network, hardware, and operating systems place
certain technical requirements and constraints on your design.
As you create your Proxy Server design, ensure that your design meets the
technical requirements and stays within the technical constraints.
11 | P a g e
-
8/6/2019 A Finalll Project Report On
12/68
3.2. SOFTWARE SYSTEM ATTRIBUTES:
1. Security:
By caching pages that have been previously requested, the proxy server
speeds up performance by responding to future requests for the same
page using the cached information rather than going to the web site
again.
When using a proxy server external systems only see the IP address of
the proxy server so the true identity of internal computers is hidden.
The proxy server can also be configured with basic rules of what ports
or IP addresses are or are not allowed to pass through which makes it a
type of basic firewall.
2. Quality:
A horizontal and vertical involvement of all concerned in project
management processes and procedures becomes very important. These
concerned persons may also be termed as stakeholders and may vary
with their existence at various levels inside and outside the
organization. All stakeholders must be well aware of the existence of
standard procedures and processes related to any project.
Well defined processes and procedures documented and distributed to
all must be harnessed for strategic long term benefits. This is important
to achieve and is possible only by way of adherence to what is
documented. A continuous adoption of such well defined processes and
procedures will definitely help in understanding, optimization and
12 | P a g e
-
8/6/2019 A Finalll Project Report On
13/68
finding out gap between benchmarks and currently adopted processes
and procedures.
Once these processes and procedures are deployed by way of providing
documents by way of hard copies of publishing on a whiteboard on
internet, it helps all to clear doubts if any in mind of any of the persons
on distribution list. Welcome any suggestion, feedback, queries or
comment from all readers of these documents.
3. Measurement:
Hits
Page View/Impression
Visit / Total user sessions
3.3. FEATURES:
* It may rewrites the client's request.
* It provides anonymity and security.
* It is a Caching Proxy Server.
* It serves as a content filter.
* Multithreadi
13 | P a g e
-
8/6/2019 A Finalll Project Report On
14/68
3.4. DISADVANTAGE OF CURRENT SYSTEM:
Proxy services lag behind nonproxied services.
Proxy services may require different servers for each service
Proxy services usually require modifications to clients, procedures, or both
Proxy services aren't workable for some services
Proxy services don't protect you from all protocol weaknesses
3.5. ADVANTAGES OF PROPOSED SYSTEM:
* Better Performance
* Less trafficking
* Reduces latency
* Conserves Bandwidth
* Good at Logging
4. PROJECT DESIGN AND IMPEMENTATION:
4.1. FEASIBILITY STUDY:
Several interrelated technical, managerial, and financial factors need to be considered
when evaluating the feasibility of accessing online journals (whether from Africa or anywhere
else). Feasibility is of course a fluid concept, as most of the important factors are adaptable,
given the will, the knowledge, and the resources. Some of the issues are relatively simple
university policy matters, others more intransigent technical or financial matters. The key
factors include:
The universitys Internet and local area network (LAN) setup: What type of server
is used? Is a university-wide proxy server in place? Does it perform caching? How
14 | P a g e
-
8/6/2019 A Finalll Project Report On
15/68
much space is available for caching? How is the LAN set up (single ring? multiple
nodes?)
The size of the user community relative to the available bandwidth: Is the user
community limited, for example to exclude undergraduates? Should the university
resell its bandwidth to third party users?
There are several possible reasons the connection worked so poorly at University.
One is that the LAN is a single physical ethernet segment connecting some one
thousand computers, with all those computers competing for LAN resources,
including bandwidth for Internet connectivity. In short, that's a lot of traffic. By
contrast, the LAN at UG is organized into smaller ethernet segments connected to
each other by an ethernet switch. This setup manages the traffic more efficiently,
as computers compete only with other computers in the same segment, and inter-
segment traffic is minimized. Thus utilization of the ethernet is made more
efficient, making it possible to add more terminals to the network with less
degradation of service. Another possible reason is that the problems were a result
of the way that Windows handles Internet data transfers. Downloading is a two-
way process involving data coming in and receipt confirmations going out. When
there is a delay in the incoming data, Windows slows down its response rate, but if
the incoming rate increases, Windows does not speed back up to match it. This
creates a tendency toward ever-decreasing speed that eventually kills the
connection once it reaches a delay of a certain length.
15 | P a g e
-
8/6/2019 A Finalll Project Report On
16/68
4.2. DATA FLOW DIAGRAM:
No Yes Yes
No
No Yes
No
Yes No
Yes
Yes
NO
16 | P a g e
Send
Request to
internet
Can requestBe filled from
Cache info
Request for internet
Resource data
Is TTL still
valid
Data retrievedsuccessfully
Generate
errorHas
Update TTL
in cache
Requestupdate
Can errorbe cached
Mark incache
Does object
meet
Cacheable
guidelines?
Send data to client
-
8/6/2019 A Finalll Project Report On
17/68
4.3. USE CASE DIAGRAM:
4.4. Development Schedule (Gantt Chart):
A Gantt chart is a type ofbar chart that illustrates aproject schedule. Gantt charts illustrate
the start and finish dates of theterminal elements and summary elements of aproject.
Terminal elements and summary elements comprise the work breakdown structureof the
project. Some Gantt charts also show thedependency (i.e., precedence network) relationships
between activities.
17 | P a g e
http://en.wikipedia.org/wiki/Bar_charthttp://en.wikipedia.org/wiki/Bar_charthttp://en.wikipedia.org/wiki/Bar_charthttp://en.wikipedia.org/wiki/Schedule_(project_management)http://en.wikipedia.org/wiki/Terminal_elementhttp://en.wikipedia.org/wiki/Terminal_elementhttp://en.wikipedia.org/wiki/Projecthttp://en.wikipedia.org/wiki/Work_breakdown_structurehttp://en.wikipedia.org/wiki/Work_breakdown_structurehttp://en.wikipedia.org/wiki/Dependency_(project_management)http://en.wikipedia.org/wiki/Dependency_(project_management)http://en.wikipedia.org/wiki/Bar_charthttp://en.wikipedia.org/wiki/Schedule_(project_management)http://en.wikipedia.org/wiki/Terminal_elementhttp://en.wikipedia.org/wiki/Projecthttp://en.wikipedia.org/wiki/Work_breakdown_structurehttp://en.wikipedia.org/wiki/Dependency_(project_management) -
8/6/2019 A Finalll Project Report On
18/68
4.5. EER Diagram:
In computer science, the enhanced entity-relationship (EER) model is a high-level or
conceptual data model incorporating extensions to the original entity-relationship (ER) model,
used in the design ofdatabases. It was developed by a need to reflect more precisely
properties and constraints that are found in more complex databases, such as in engineering
design and manufacturing (CAD/CAM), telecommunications, complex software systemsand
geographic information systems (GIS).
4.6. Implementation:It is very important part of software development as we complete our
software than we go for the installation of the software to the user end. Where we
keep in mind the h/w & s/w requirement and plus we also train the employee who do
not have knowledge of computers. Though we have made the software user friendly
but than also we prepare user manual to operate the software easily & safely. We
also bring out the changes in h/w if it would not support the software and same would
be the case with the s/w and operating system.
Implementation is the most important part of software development. In
this phase after the completion of the software we go for its installation on the
system. In this phase we keep in mind that it takes the minimum amount of software
and hardware requirements in order to perform its various tasks correctly and
accurately. The software should be such that even a nave user can easily operate all
its functions properly.
In the implementation phase we make sure that the software is performing
all its desired tasks properly using the minimum possible software and hardwarerequirements. In the implementation phase we make sure that the software is user
friendly so that any new user can easily operate on it.
I hope this software will fully satisfy the needs and requirements of Caching
Proxy Server.
18 | P a g e
http://en.wikipedia.org/wiki/Computer_sciencehttp://en.wikipedia.org/wiki/Conceptual_schemahttp://en.wikipedia.org/wiki/Entity-relationship_modelhttp://en.wikipedia.org/wiki/Databasehttp://en.wikipedia.org/wiki/Databasehttp://en.wikipedia.org/wiki/CADhttp://en.wikipedia.org/wiki/CADhttp://en.wikipedia.org/wiki/Computer-aided_manufacturinghttp://en.wikipedia.org/wiki/Telecommunicationshttp://en.wikipedia.org/wiki/Software_systemshttp://en.wikipedia.org/wiki/Software_systemshttp://en.wikipedia.org/wiki/Geographic_information_systemshttp://en.wikipedia.org/wiki/Computer_sciencehttp://en.wikipedia.org/wiki/Conceptual_schemahttp://en.wikipedia.org/wiki/Entity-relationship_modelhttp://en.wikipedia.org/wiki/Databasehttp://en.wikipedia.org/wiki/CADhttp://en.wikipedia.org/wiki/Computer-aided_manufacturinghttp://en.wikipedia.org/wiki/Telecommunicationshttp://en.wikipedia.org/wiki/Software_systemshttp://en.wikipedia.org/wiki/Geographic_information_systems -
8/6/2019 A Finalll Project Report On
19/68
4.7. CODE:
Coding is undertaken once the design phase is complete and the design documents have been
successfully reviewed. In the coding phase, every module identified and specified in the
design document is independently code and unit tested. Project coding is given under
Appendix A.
4.8. TESTING:
Objective of Testing:
Testing is a process of the executing a program with the intent of the
finding an error.
A good test case is one that has a high probability of the finding an as-yet
undiscovered error.
A successful test is one that is one uncovers as-yet undiscovered error. If
the testing is conducted successfully it will uncover errors in the software.
Testing can not show the absence of the defects, it can only show that
software errors are present.
Testing principles:
2. All tests should be traceable to customer requirements.
3. Tests should be planned long before testing begins.
4. Testing should begin in the small and progress toward testing in the large.
5. Exhaustive testing is not possible.
19 | P a g e
-
8/6/2019 A Finalll Project Report On
20/68
Type of Testing:
1. White-box Testing:
This testing is also known as glass-box testing. Using white-box testing, test
cases are derived that
Guarantee that all independent path with in a module have been exercised at
last once;
Exercise all logical decisions on their boundaries and with in their operational
bounds; and
Exercise internal data structures to assure their validity.
Reasons for preferring White-box Testing:
Logic errors and incorrect assumptions are inversely proportional to the
probability that a program path will be executed.
We often believe that a logical path is not likely to be executed when
infect it may be executed on a regularly basis.
Topographical errors are random.
2. Black Box Testing:
This testing focuses on the functional requirements of the software i.e. it
enables to derive set of the input conditions that will folly exercise all functional
requirements for a program. It is not an alternative to white-box techniques
rather it is a complementary approach i.e. likely to uncover a different class of
than white-box Testing methods.
20 | P a g e
-
8/6/2019 A Finalll Project Report On
21/68
Black-box attempts to find errors the following categories:
Incorrect or missing function,
Interface errors,
Error in data structure or external database access
Performance errors
4.9. EXPERIMENTAL SETUP:
Your experimental setup will consist of running your client and the proxy server on one
machine, while the origin server on another machine (most likely in the same lab). You
might have some issues with making your proxy server talk to the remote server through
RMI because of firewall issues. Java RMI does not use port 80 for communication: by
default rmiregistry runs on port 1099 and then assigns some random ports to RMI
sockets). A representative of the Techstaff in the CS Department has assured me that all
the Linux machines in undergraduate labs are not firewalled for intra-domain access.
Windows machines are more heavily firewalled, but this still should not be a problem for
intra-domain access. Youll have to find a setup thatll make it possible for you to run all
your experiments. Since this is a Java-based project, you should have no problem running
your programs on any operating system.
6. CONCLUSION AND FUTURE SCOPE:
a) CONCLUSION:
The caching proxy server proved to be the single biggest saver of available bandwidth
for the hobbits. It reduced the effective browsing time for the common sites to a minimum and
surfing was no longer the drag it used to be.
21 | P a g e
-
8/6/2019 A Finalll Project Report On
22/68
b) FUTURE SCOPE:
The caching proxy server as stand-alone product is an endangered species.In its place, we'll
continue to see software firewalls expand their breadth to include the kind of content filtering,
caching, and authentication that was traditionally the role of the proxy server.However, the testing process downloads webpages which consume network bandwidth, so
it
is suggested that in the future, it can re-use the statistical information from some existing
measurement system like perfSONAR, so that it need not download webpages frequently..
5. APPENDIX:
a) Coding:
Module 1: Server.java
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import proxy.Proxy;
import proxy.HttpReplyHdr;
import proxy.HttpRequestHdr;
import proxy.Configuration;
import proxy.ServerDataBase;
import proxy.Cache;
22 | P a g e
-
8/6/2019 A Finalll Project Report On
23/68
import proxy.ServersAccessibleWOProxy;
import proxy.DocumentInfo;
import proxy.ServerInfo;
import proxy.MainFrame;
/*
*
* Server
*
*/
public class Server extends Thread
{
final static int defaultServerPort = 8080;
final static int maxServerPort = 65536;
private static Configuration config ;
private static ServerDataBase serverDataBase ;
private static Cache cache ;
private static ServersAccessibleWOProxy serversAccessibleWOProxy;
public static void main(String args[])
{
int serverPort;
23 | P a g e
-
8/6/2019 A Finalll Project Report On
24/68
switch (args.length) {
case 0: serverPort = defaultServerPort;
break;
case 1: try {
serverPort = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.out.println("Error: Invalid server port");
return;
}
if (serverPort > maxServerPort) {
System.out.println("Error: Invalid server port");
return;
}
break;
default:System.out.println("Usage: Server [port]");
return;
}
ServerSocket serverSocket = null;
int initialNoOfThreads = 0;
// Initialize main data structures.
config = new Configuration();
24 | P a g e
-
8/6/2019 A Finalll Project Report On
25/68
MainFrame mainFrame = new MainFrame("HTTP Proxy Server",config);
mainFrame.updateLog("HTTP Proxy Server 1.0");
mainFrame.updateLog("Initializing servers database...");
serverDataBase = new ServerDataBase(config);
mainFrame.updateLog("Initializing cache...");
cache = new Cache(config, serverDataBase, mainFrame);
mainFrame.updateLog("Initializing list of servers whose documents should not be
cached...");
serversAccessibleWOProxy = new ServersAccessibleWOProxy(config);
mainFrame.setServersAccessibleWOProxy(serversAccessibleWOProxy);
mainFrame.setCache(cache);
// accept incoming requests and initiate threads to handle them.
try {
mainFrame.updateLog("Initializing listening port ("+serverPort+")...");
serverSocket = new ServerSocket(serverPort);
mainFrame.serverSocket = serverSocket;
mainFrame.updateLog("Initializations complete, server up and running.\n");
initialNoOfThreads = activeCount();System.out.println(initialNoOfThreads);
25 | P a g e
-
8/6/2019 A Finalll Project Report On
26/68
for (int i=1;i initialNoOfThreads)
// yield();
// shut down the proxy.
config.shutDown(serverDataBase.shutDown() &&
26 | P a g e
-
8/6/2019 A Finalll Project Report On
27/68
cache.shutDown() &&
serversAccessibleWOProxy.shutDown());
System.exit(0);
}
}
Module 2: Proxy.java
package proxy;
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import proxy.HttpReplyHdr;
import proxy.HttpRequestHdr;
import proxy.Configuration;
import proxy.ServerDataBase;
import proxy.Cache;
import proxy.ServersAccessibleWOProxy;
import proxy.DocumentInfo;
import proxy.ServerInfo;
import proxy.MainFrame;
27 | P a g e
-
8/6/2019 A Finalll Project Report On
28/68
public class Proxy extends Thread {
private static Integer hits = new Integer(0);
private static Integer misses = new Integer(0);
private Configuration config;
private ServerDataBase serverDataBase;
private Cache cache;
private ServersAccessibleWOProxy serversAccessibleWOProxy;
private MainFrame mainFrame;
private Socket client = null;
public Proxy(Socket socket,
Configuration p_config,
ServerDataBase p_serverDataBase,
Cache p_cache,
ServersAccessibleWOProxy p_serversAccessibleWOProxy,
MainFrame p_mainFrame)
{
client = socket;
config = p_config;
serverDataBase = p_serverDataBase;
cache = p_cache;
serversAccessibleWOProxy = p_serversAccessibleWOProxy;
mainFrame = p_mainFrame;
public void run(){
28 | P a g e
-
8/6/2019 A Finalll Project Report On
29/68
Socket server = null;
String clientName ="";
String serverName ="";
URL url;
HttpRequestHdr request = new HttpRequestHdr();
HttpReplyHdr reply = new HttpReplyHdr();
boolean documentInCache = false;
boolean serverFilesMayBeCached = false;
DocumentInfo documentInfo;
File file = null;
FileOutputStream fileToCache = null;
try {
System.out.println("in proxy");
request.parse(client.getInputStream());
clientName = client.getInetAddress().getHostName();
url = new URL(request.url);
mainFrame.updateLog("Client '" + clientName +
"' Requesting '" + request.url+"'");
synchronized(serversAccessibleWOProxy) {
if(!serversAccessibleWOProxy.containsKey(url.getHost()))
29 | P a g e
-
8/6/2019 A Finalll Project Report On
30/68
serverFilesMayBeCached = true;
}
synchronized(cache) {
if(serverFilesMayBeCached &&
!request.pragmaNoCache &&
request.ifModifiedSince.equals("") &&
cache.containsKey(url)) {
documentInCache = true;
documentInfo = (DocumentInfo)cache.get(url);
}
else documentInfo = null;
}
// If the request is cached, channel it to client.
if(documentInCache) {
synchronized (documentInfo) {
File cachedFile = new File(config.getCacheDirectory(),
documentInfo.getFileName());
if (cachedFile.exists()) {
mainFrame.updateLog("Retrieving "+ request.url + "
from cache.");
synchronized (hits) {
hits = new Integer(hits.intValue()+1);
mainFrame.updatePieChart(hits.intValue(),
misses.intValue());
30 | P a g e
-
8/6/2019 A Finalll Project Report On
31/68
}
documentInfo.incrementReferences();
FileInputStream in = new
FileInputStream(cachedFile);
OutputStream out = client.getOutputStream();
byte data[] = new byte[2000];
int count;
while (-1 < ( count = in.read(data))) {
out.write(data,0,count);
Thread.yield();
}
try {out.flush();} catch (Exception ef1){}
try {in.close();} catch (Exception e){}
try {client.close();} catch (Exception e){}
return;
}
}
}
if(serverFilesMayBeCached &&
!request.pragmaNoCache &&
request.ifModifiedSince.equals(""))
{
31 | P a g e
-
8/6/2019 A Finalll Project Report On
32/68
synchronized(misses) {
misses = new Integer(misses.intValue()+1);
mainFrame.updatePieChart(hits.intValue(), misses.intValue());
}
}
Date timerStart;
Date timerEnd;
if (config.alternativeProxyOn()) {
serverName = config.getAlternativeProxyName();
timerStart = new Date();
server = new Socket(serverName,config.getAlternativeProxyPort());
}
else {
serverName = serverName(request.url);
timerStart = new Date();
server = new Socket(serverName,serverPort(request.url));
}
timerEnd = new Date();
long connectionTime = timerEnd.getTime() - timerStart.getTime();
mainFrame.updateLog("Passing the request for "+request.url+" to "+
serverName);
DataOutputStream srvOut =
32 | P a g e
-
8/6/2019 A Finalll Project Report On
33/68
new DataOutputStream(server.getOutputStream());
if (!config.alternativeProxyOn())
request.url = serverUrl(request.url);
srvOut.writeBytes(request.toString(false));
srvOut.flush();
/*
* Send data to server (needed for post method and things
* that go bump in the net).
*/
for (int i =0; i < request.contentLength; i++) {
server.getOutputStream().write(client.getInputStream().read());
}
server.getOutputStream().flush();
/*
* Echo and send the HTTP responce header from
* the server to the client.
*/
DataInputStream Din =
new DataInputStream(server.getInputStream());
DataOutputStream Dout =
new DataOutputStream(client.getOutputStream());
timerStart = new Date(); // start timing transmission of responce.
String statusLine = Din.readLine();
33 | P a g e
-
8/6/2019 A Finalll Project Report On
34/68
StringTokenizer st = new StringTokenizer(statusLine);
// Parse responce header
st.nextToken(); // HTTP version
String returnCode = st.nextToken();
if (!returnCode.equals("200") || !serverFilesMayBeCached) {
mainFrame.updateLog("Transferring "+request.url+ " to
"+clientName);
Dout.writeBytes(statusLine + "\r\n");
if (statusLine.length() > 0) {
while (true) {
String str = Din.readLine();
Dout.writeBytes(str+"\r\n");
if (str.length()
-
8/6/2019 A Finalll Project Report On
35/68
}
try {out.flush();} catch (Exception ef1){}
try {in.close();} catch (Exception e){}
try {client.close();} catch (Exception e){}
if (serverFilesMayBeCached) {
// reply did not include body, so only connection time info
// is saved.
synchronized (serverDataBase) {
if (serverDataBase.containsKey(url.getHost()))
((ServerInfo)serverDataBase.get(url.getHost())).
updateAverageConnectionTime(connectionTime,
config.getServerInfoSmoothingFactor());
}
}
return;
}
// channel reply to client and cache it
String fileName = config.getNextFileName();
long fileSize = 0;
35 | P a g e
-
8/6/2019 A Finalll Project Report On
36/68
file = new File(config.getCacheDirectory(), fileName);
fileToCache = new FileOutputStream(file);
mainFrame.updateLog("Transferring "+request.url+ " to "+clientName +
" and saving to local file " +fileName);
byte[] bytes; // buffer for outputing strings.
statusLine += "\r\n";
fileSize += statusLine.length();
Dout.writeBytes(statusLine);
bytes = new byte[statusLine.length()];
statusLine.getBytes(0,statusLine.length(),bytes,0);
fileToCache.write(bytes);
if (statusLine.length() > 2) {
while (true) {
String str = Din.readLine() + "\r\n";
fileSize += str.length();
Dout.writeBytes(str);
bytes = new byte[str.length()];
str.getBytes(0,str.length(),bytes,0);
fileToCache.write(bytes);
if (str.length()
-
8/6/2019 A Finalll Project Report On
37/68
Dout.flush();
InputStream in = server.getInputStream();
OutputStream out = client.getOutputStream();
byte data[] = new byte[2000];
int count;
while (-1 < ( count = in.read(data))) {
fileSize += count;
out.write(data,0,count);
fileToCache.write(data,0,count);
Thread.yield(); // Remember this is multi-threaded
}
timerEnd = new Date();
// Estimate bandwidth [bytes/seconds]
double bandWidth = 1000 * fileSize
/(timerEnd.getTime() - timerStart.getTime());
try {out.flush();} catch (Exception ef1){}
try {in.close();} catch (Exception e){}
try {client.close();} catch (Exception e){}
try {fileToCache.flush();} catch (Exception e) {}
try {fileToCache.close();} catch (Exception e){}
// Update server data base.
37 | P a g e
-
8/6/2019 A Finalll Project Report On
38/68
synchronized (serverDataBase) {
ServerInfo serverInfo;
if (!serverDataBase.containsKey(url.getHost())) {
serverInfo = new ServerInfo(url.getHost(),
connectionTime,bandWidth);
serverDataBase.put(url.getHost(), serverInfo);
}
else {
serverInfo = (ServerInfo)serverDataBase.get(url.getHost());
serverInfo.updateAverageBandWidth(bandWidth,
config.getServerInfoSmoothingFactor());
serverInfo.updateAverageConnectionTime(connectionTime,
config.getServerInfoSmoothingFactor());
serverInfo.incrementReferences();
}
}
mainFrame.updateLog("Caching "+request.url);
synchronized (cache) {
if (cache.containsKey(url)) {
documentInfo = (DocumentInfo)cache.get(url);
synchronized (documentInfo) {
cache.incrementCurrentWaterMark(
38 | P a g e
-
8/6/2019 A Finalll Project Report On
39/68
fileSize - documentInfo.getSize());
File oldFileName = new
File(config.getCacheDirectory(),
documentInfo.getFileName());
try { oldFileName.delete(); } catch(Exception e) {};
documentInfo.setFileName(fileName);
documentInfo.setSize(fileSize);
documentInfo.incrementReferences();
}
cache.put(url, documentInfo);
}
else {
documentInfo = new DocumentInfo(url, fileName, fileSize);
cache.incrementCurrentWaterMark(fileSize);
cache.put (url, documentInfo);
}
mainFrame.updateCacheBar(config.getCacheHighWaterMark(),
config.getCacheLowWaterMark(),
cache.getCurrentWaterMark());
}
return;
}
39 | P a g e
-
8/6/2019 A Finalll Project Report On
40/68
catch (UnknownHostException uhe)
{
mainFrame.updateLog("Server Not Found"+uhe.toString());
try {
DataOutputStream out =
new DataOutputStream(client.getOutputStream());
out.writeBytes(reply.formNotFound());
out.flush();
} catch (Exception uhe2){}
} catch (Exception e) {
mainFrame.updateLog("Proxy error"+e.toString());
try {
DataOutputStream out =
new DataOutputStream(client.getOutputStream());
out.writeBytes(reply.formInternalError());
out.flush();
} catch (Exception uhe2){}
try {fileToCache.close();} catch (Exception e1) {}
try {file.delete();} catch (Exception e2) {}
} finally {
try {client.getOutputStream().flush();} catch (Exception ef1){}
40 | P a g e
-
8/6/2019 A Finalll Project Report On
41/68
try {server.close();} catch (Exception e){}
try {client.close();} catch (Exception e){}
mainFrame.updateLog("Done [" + clientName+"] "+ request.url);
}
}
private String serverName(String str) {
// chop to "server.name:x/thing"
int i = str.indexOf("//");
if (i< 0) return "";
str = str.substring(i+2);
// chop to server.name:xx
i = str.indexOf("/");
if (0 < i) str = str.substring(0,i);
// chop to server.name
i = str.indexOf(":");
if (0 < i) str = str.substring(0,i);
return str;
}
private int serverPort(String str) {
// chop to "server.name:x/thing"
int i = str.indexOf("//");
41 | P a g e
-
8/6/2019 A Finalll Project Report On
42/68
if (i< 0) return 80;
str = str.substring(i+2);
// chop to server.name:xx
i = str.indexOf("/");
if (0 < i) str = str.substring(0,i);
// chop XX
i = str.indexOf(":");
if (0 < i) {
return Integer.parseInt(str.substring(i).trim());
}
return 80;
}
private String serverUrl(String str) {
int i = str.indexOf("//");
if (i< 0) return str;
str = str.substring(i+2);
i = str.indexOf("/");
if (i< 0) return str;
return str.substring(i);
}
}
42 | P a g e
-
8/6/2019 A Finalll Project Report On
43/68
Module 3: Mainframe.java
import java.net.*;
import java.awt.*;
import proxy.Configuration;
import PieChart;
import CacheDlg;
import ServerDataBaseDlg;
import AlternativeProxyDlg;
import proxy.ServersAccessibleWOProxy;
import AboutDlg;
import proxy.Cache;
public class MainFrame extends Frame
{
private Configuration config;
private Cache cache;
public ServerSocket serverSocket;
private MainMenu mainMenu;
private PieChart pieChart;
private CacheBar cacheBar;
private LogArea logArea;
private GridBagLayout gridBag;
private GridBagConstraints constraints;
43 | P a g e
-
8/6/2019 A Finalll Project Report On
44/68
private boolean shuttingDown;
private ServersAccessibleWOProxy serversAWOP = null;
public MainFrame(String title, Configuration p_config)
{
super(title);
config = p_config;
resize(800,500);
mainMenu = new MainMenu(this);
mainMenu.CreateMenu();
gridBag = new GridBagLayout();
constraints = new GridBagConstraints();
setLayout(gridBag);
constraints.gridwidth = 1;
constraints.gridheight = 2;
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1;
constraints.weighty = 1;
logArea = new LogArea(30,60);
gridBag.setConstraints(logArea,constraints);
44 | P a g e
-
8/6/2019 A Finalll Project Report On
45/68
add(logArea);
constraints.gridwidth = GridBagConstraints.REMAINDER;
constraints.gridheight = 1;
constraints.weightx = 0;
pieChart = new PieChart();
pieChart.setBackground(Color.gray.brighter());
gridBag.setConstraints(pieChart,constraints);
add(pieChart);
cacheBar = new CacheBar(config.getCacheHighWaterMark(),
config.getCacheLowWaterMark(),
config.getCacheCurrentWaterMark());
cacheBar.setBackground(Color.gray.brighter());
gridBag.setConstraints(cacheBar,constraints);
add(cacheBar);
shuttingDown = false;
repaint();
pack();
move (250, 30);
show();
}
45 | P a g e
-
8/6/2019 A Finalll Project Report On
46/68
public void updatePieChart(int hits, int misses)
{
pieChart.updatePieChart(hits, misses);
}
public void updateCacheBar(long p_highWM, long p_lowWM, long p_currentWM)
{
cacheBar.updateCacheBar(p_highWM, p_lowWM, p_currentWM);
}
public void updateLog(String str)
{
logArea.appendText(str+"\n");
}
public boolean handleEvent (Event event)
{
if(shuttingDown)
return (true);
switch (event.id) {
case Event.WINDOW_DESTROY:
shuttingDown = true;
try {serverSocket.close();} catch (Exception e) {}
break;
case Event.ACTION_EVENT:
if(event.target instanceof MenuItem) {
46 | P a g e
-
8/6/2019 A Finalll Project Report On
47/68
if(((String)event.arg).equals("Exit")) {
shuttingDown = true;
try {serverSocket.close();} catch (Exception e) {}
}
else if(((String)event.arg).equals("Cache")) {
if (cache == null)
return super.handleEvent(event);
CacheDlg cd = new CacheDlg(this, "Cache
Parameters",config, cache);
}
else if(((String)event.arg).equals("Servers Data Base")) {
ServerDataBaseDlg sdb = new ServerDataBaseDlg(this,
"Servers Data Base
Parameters",config);
}
else if(((String)event.arg).equals("Alternative Proxy")) {
AlternativeProxyDlg ap = new
AlternativeProxyDlg(this,
"Alternative Proxy
Parameters",config);
}
else if(((String)event.arg).equals("No Cache Servers")) {
if (serversAWOP == null)
return super.handleEvent(event);
ServersAccessibleWOProxyDlg sawp =
new ServersAccessibleWOProxyDlg(this,
"No Cache Servers", serversAWOP);
47 | P a g e
-
8/6/2019 A Finalll Project Report On
48/68
}
else if(((String)event.arg).equals("About")) {
AboutDlg cd = new AboutDlg(this);
}
}
break;
default:
return super.handleEvent(event);
}
return true;
}
public void setServerSocket(ServerSocket p_serverSocket)
{
serverSocket = p_serverSocket;
}
public void setServersAccessibleWOProxy(ServersAccessibleWOProxy sawop)
{
serversAWOP = sawop;
}
public void setCache(Cache p_cache)
{
cache = p_cache;
48 | P a g e
-
8/6/2019 A Finalll Project Report On
49/68
}
}
Module 4: Cache.java
package proxy;
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import proxy.DocumentInfo;
import proxy.ServerDataBase;
import proxy.Configuration;
import proxy.DocumentMark;
import MainFrame;
public class Cache extends Hashtable
{
private long currentWaterMark;
private Configuration config;
private ServerDataBase serverDataBase;
private MainFrame mainFrame;
public Cache(Configuration p_config,
49 | P a g e
-
8/6/2019 A Finalll Project Report On
50/68
ServerDataBase p_serverDataBase,
MainFrame p_mainFrame)
{
super();
config = p_config;
serverDataBase = p_serverDataBase;
mainFrame = p_mainFrame;
currentWaterMark = config.getCacheCurrentWaterMark();
DocumentInfo documentInfo;
File fileInHand;
try {
RandomAccessFile in = new RandomAccessFile(
config.getCacheBackupFile(),"r");
String s = in.readLine().substring(1);
in.close();
StringTokenizer st = new StringTokenizer(s);
String key;
String documentInfoStr;
Hashtable filesIndexedInCache = new Hashtable();
int maxEnumerator = 0;
50 | P a g e
-
8/6/2019 A Finalll Project Report On
51/68
try {
if (config.proxyBroughtDownProperly())
while(st.hasMoreElements()) {
key = st.nextToken("=");
while (key.substring(0,1).equals(" "))
key = key.substring(1);
// chop " "
documentInfoStr = st.nextToken(",}");
documentInfoStr = documentInfoStr.substring(1);
//chop "="
put(new URL(key), new
DocumentInfo(documentInfoStr));
}
else {
Object dummy = new Object();
currentWaterMark = 0;
while(st.hasMoreElements()) {
key = st.nextToken("=");
while (key.substring(0,1).equals(" "))
key = key.substring(1);
// chop " "
documentInfoStr = st.nextToken(",}");
51 | P a g e
-
8/6/2019 A Finalll Project Report On
52/68
documentInfoStr = documentInfoStr.substring(1);
//chop "="
documentInfo = new
DocumentInfo(documentInfoStr);
fileInHand = new
File(config.getCacheDirectory(),
documentInfo.getFileName());
if(fileInHand.exists()) {
put(new URL(key), documentInfo);
filesIndexedInCache.put(fileInHand,
dummy);
try {
((ServerInfo)(serverDataBase
.get(documentInfo.getUrl().
getHost())))
.incrementReferences();
} catch (NullPointerException npe) { //
inconsistent BAK files
serverDataBase.clear();
throw new
NoSuchElementException(); // pass control to next catch
}
52 | P a g e
-
8/6/2019 A Finalll Project Report On
53/68
incrementCurrentWaterMark(documentInfo.getSize());
if(maxEnumerator = lowWaterMark; i++) {
documentInfoInHand = (DocumentInfo)array[i].getDocumentInfo();
synchronized (documentInfoInHand) {
fileInHand = new File(cacheDirectory,
documentInfoInHand.getFileName());
fileInHand.delete();
}
decrementCurrentWaterMark(documentInfoInHand.getSize());
remove(documentInfoInHand.getUrl());
synchronized (serverDataBase) {
serverInfoInHand = (ServerInfo)serverDataBase.get(
documentInfoInHand.getUrl().getHost());
if(serverInfoInHand.decrementReferences() == 0)
serverDataBase.remove(documentInfoInHand
.getUrl().getHost());
}
}
mainFrame.updateCacheBar(highWaterMark,lowWaterMark,currentWaterMark);
}
private double documentMark (DocumentInfo documentInfo, ServerInfo serverInfo,
58 | P a g e
-
8/6/2019 A Finalll Project Report On
59/68
double wCT, double wBW, double wRF, double
wS)
{
return ((wCT * serverInfo.getAverageConnectionTime() +
wBW / serverInfo.getAverageBandWidth()) *
Math.pow(documentInfo.getReferencesPerHour(),wRF) /
Math.pow(documentInfo.getSize(),wS));
}
private void sort(DocumentMark[] array, int left, int right)
{
if (left >= right)
return;
int mid = split(array,left,right);
sort(array, left, mid-1);
sort(array, mid+1, right);
}
private int split(DocumentMark[] array, int p_left, int p_right)
{
double mid = array[p_left].getMark();
int left = p_left+1;
int right = p_right;
59 | P a g e
-
8/6/2019 A Finalll Project Report On
60/68
DocumentMark temp;
while(left
-
8/6/2019 A Finalll Project Report On
61/68
import java.io.InputStream;
import java.io.DataInputStream;
import java.util.StringTokenizer;
public class HttpRequestHdr
{
public String method = new String();
public String url = new String();
public String version = new String();
public String userAgent = new String();
public String referer = new String();
public String ifModifiedSince = new String();
public String accept = new String();
public String authorization = new String();
public String contentType = new String();
public int contentLength = -1;
public int oldContentLength = -1;
public String unrecognized = new String();
public boolean pragmaNoCache = false;
static String CR ="\r\n";
public boolean parse(InputStream In)
{
61 | P a g e
-
8/6/2019 A Finalll Project Report On
62/68
String CR ="\r\n";
DataInputStream lines;
StringTokenizer tz;
try {
lines = new DataInputStream(In);
tz = new StringTokenizer(lines.readLine());
} catch (Exception e) {
return false;
}
method = getToken(tz).toUpperCase();
url = getToken(tz);
version= getToken(tz);
while (true) {
try {
tz = new StringTokenizer(lines.readLine());
} catch (Exception e) {
return false;
}
String Token = getToken(tz);
if (0 == Token.length())
break;
if (Token.equalsIgnoreCase("USER-AGENT:")) {
userAgent = getRemainder(tz);
62 | P a g e
-
8/6/2019 A Finalll Project Report On
63/68
} else if (Token.equalsIgnoreCase("ACCEPT:")) {
accept += " " + getRemainder(tz);
} else if (Token.equalsIgnoreCase("REFERER:")) {
referer = getRemainder(tz);
} else if (Token.equalsIgnoreCase("PRAGMA:")) {
// Pragma:
Token = getToken(tz);
if (Token.equalsIgnoreCase("NO-CACHE"))
pragmaNoCache = true;
else
unrecognized += "Pragma:" + Token + " "
+getRemainder(tz) +"\n";
} else if (Token.equalsIgnoreCase("AUTHORIZATION:")) {
// Authenticate: Basic UUENCODED
authorization= getRemainder(tz);
} else if (Token.equalsIgnoreCase("IF-MODIFIED-SINCE:")) {
String str = getRemainder(tz);
int index = str.indexOf(";");
if (index == -1) {
ifModifiedSince =str;
} else {
63 | P a g e
-
8/6/2019 A Finalll Project Report On
64/68
ifModifiedSince =str.substring(0,index);
index = str.indexOf("=");
if (index != -1) {
str = str.substring(index+1);
oldContentLength =Integer.parseInt(str);
}
}
} else if (Token.equalsIgnoreCase("CONTENT-LENGTH:")) {
Token = getToken(tz);
contentLength =Integer.parseInt(Token);
} else if (Token.equalsIgnoreCase("CONTENT-TYPE:")) {
contentType = getRemainder(tz);
} else {
unrecognized += Token + " " + getRemainder(tz) + CR;
}
}
return true;
}
public String toString(boolean sendUnknowen) {
String Request;
if (0 == method.length())
method = "GET";
64 | P a g e
-
8/6/2019 A Finalll Project Report On
65/68
Request = method +" "+ url + " HTTP/1.0" + CR;
if (0 < userAgent.length())
Request +="User-Agent:" + userAgent + CR;
if (0 < referer.length())
Request+= "Referer:"+ referer + CR;
if (pragmaNoCache)
Request+= "Pragma: no-cache" + CR;
if (0 < ifModifiedSince.length())
Request+= "If-Modified-Since: " + ifModifiedSince + CR;
// ACCEPT TYPES //
if (0 < accept.length())
Request += "Accept: " + accept + CR;
else
Request += "Accept: */"+"* \r\n";
if (0 < contentType.length())
Request += "Content-Type: " + contentType + CR;
if (0 < contentLength)
Request += "Content-Length: " + contentLength + CR;
65 | P a g e
-
8/6/2019 A Finalll Project Report On
66/68
if (0 != authorization.length())
Request += "Authorization: " + authorization + CR;
if (sendUnknowen) {
if (0 != unrecognized.length())
Request += unrecognized;
}
Request += CR;
return Request; }
public String toString() {
return toString(true);
}
String getToken(StringTokenizer tk){
String str ="";
if (tk.hasMoreTokens())
str =tk.nextToken();
return str;
}
String getRemainder(StringTokenizer tk){
String str ="";
if (tk.hasMoreTokens())
str =tk.nextToken();
while (tk.hasMoreTokens()){
str +=" " + tk.nextToken();
}
66 | P a g e
-
8/6/2019 A Finalll Project Report On
67/68
return str;
}
}
b) Gantt Chart:
67 | P a g e
-
8/6/2019 A Finalll Project Report On
68/68
6. BIBLIOGRAPHY:
Wrox Java Networking.
Object-Oriented Modeling and Design-James Rambaugh
Beej's Guide to Socket Programming.
Wikipedia