Java Network programming

Source: Internet
Author: User
Tags ftp site gopher

Thinking before class
1. What is the TCP/IP protocol?
2. What are the two transport protocols for TCP/IP and what are the characteristics of each?
3. What is a URL?
4. What is the relationship between URL and IP address?
5. What is a socket (socket)?
6. What is the relationship between the socket and the TCP/IP protocol?
7. URL and socket (socket) relationship?
8. 1 Basic concepts of network programming, Introduction to TCP/IP protocol

8.1.1 Network Basics
The purpose of network programming is to communicate with other computers directly or indirectly through network protocols. There are two main problems in network programming, one is how to locate one or more hosts on the network accurately, and the other is how to reliably and efficiently transmit data after finding the host. In the TCP/IP protocol, it is mainly responsible for the location of the network host, the routing of data transmission, and the IP address can uniquely determine a host on the Internet. The TCP layer provides an application-oriented reliable or unreliable data transmission mechanism, which is the main object of network programming, and generally does not need to care about how the IP layer handles the data.
At present, the popular network programming model is the client/server (c/s) structure. That is, both sides of the communication are waiting for the client to request and respond as a server. The customer requests the server when the service is required. Server generally as a daemon always run, listen to the network port, once a customer request, will start a service process to respond to the customer, while continuing to monitor the service port, so that later customers can also be timely service.

8.1. Class 32 Transfer Protocol: TCP;UDP
Although TCP is the only protocol name in the TCP/IP protocol, TCP and UDP two protocols are present at the transport layer of TCP/IP.
TCP is the short name of Tranfer Control protocol and is a connection-oriented protocol that guarantees reliable transmission. With the TCP protocol transmission, a sequential error-free data stream is obtained. A connection must be established between the sender and the receiver's paired two sockets to communicate on the basis of the TCP protocol, and when a socket (usually a server socket) waits for a connection, the other socket can require a connection. Once the two sockets are connected, they can carry out two-way data transfer and both can send or receive operations.
UDP is the abbreviation of User Datagram protocol, is a non-connected protocol, each datagram is a separate information, including the full source address or destination address, it on the network with any possible path to the destination, so can reach the destination, The time to reach the destination and the correctness of the content are not guaranteed.
Here we make a simple comparison between the two protocols:
With UDP, the full address information is given in each datagram, so there is no need to establish a connection between the sender and the receiver. For the TCP protocol, since it is a connection-oriented protocol, it is necessary to establish a connection before data transfer between sockets, so there is more time to establish a connection in TCP.
There is a size limit for transmitting data using UDP, and each transmitted datagram must be limited to 64KB. TCP does not have this limitation, and once the connection is established, the sockets on both sides can transmit large amounts of data in a uniform format. UDP is an unreliable protocol in which datagrams sent by the sender do not necessarily reach the receiver in the same order. TCP is a reliable protocol that ensures that the receiver is getting all the data sent by the sender in full and proper order.
In short, TCP has strong vitality in network communications, such as remote Connection (Telnet) and file Transfer (FTP), which require the data to be reliably transmitted over an indefinite length. In contrast, UDP is easy to operate and requires less monitoring, so it is often used for client/server applications in decentralized systems with high LAN reliability.
Readers may want to ask why the UDP protocol is not reliably transmitted, since there is a TCP protocol that guarantees reliable transmission. There are two main reasons for this. First, reliable transmission is to pay a price, the correctness of the data content of the test must occupy the computer processing time and network bandwidth, so the efficiency of TCP transmission is not as high as UDP. Second, in many applications do not need to ensure strict transmission reliability, such as video conferencing system, does not require audio and video data is absolutely correct, as long as the consistency can be guaranteed, in this case, obviously using UDP is more reasonable.

8. 2 high-level Java network programming based on URLs

8.2.1 Consistent Resource Locator URL
A URL (Uniform Resource Locator) is the short name of a consistent resource locator that represents the address of a resource on the Internet. Through the URL we can access various network resources on the Internet, such as the most common www,ftp site. The browser can find the appropriate file or other resource on the network by parsing the given URL.
8.2.2 The composition of the URL

Protocol://resourcename
The Protocol name (protocol) indicates the transport protocol used to obtain the resource, such as HTTP, FTP, Gopher, file, and so on, and the Resource name (resourcename) should be the full address of the resource, including the hostname, port number, file name, or a reference inside the file. For example:
http://www.sun.com/protocol Name://Host Name
Http://home.netscape.com/home/welcome.html protocol Name://Machine name + file name
Http://www.gamelan.com:80/Gamelan/network.html#BOTTOM protocol Name://Machine name + port number + file name + Internal Reference

8.2.3 Create a URL

To represent the URL, the class URL is implemented in java.net. We can initialize a URL object by constructing the following method:
(1) Public URL (String spec);
A URL object can be constructed from a string that represents a URL address.
URL urlbase=new url ("http://www. 263.net/")
(2) Public URL (URL context, String spec);
Constructs a URL object from a base URL and a relative URL.
URL net263=new url ("http://www.263.net/");
URL index263=new url (net263, "index.html")
(3) Public URL (string protocol, string host, string file);
The new URL ("http", "www.gamelan.com", "/pages/gamelan.net"). HTML ");
(4) Public URL (string protocol, string host, int port, string file);
URL gamelan=new url ("http", "www.gamelan.com", "pages/gamelan.network.html");

Note: The constructor of the class URL declares that it discards the non-runtime exception (malformedurlexception), so when generating the URL object, we have to deal with this exception, usually with the Try-catch statement. The format is as follows:

try{
URL myurl= new URL (...)
}catch (Malformedurlexception e) {
...

}

8.2.4 parsing a URL
After a URL object is generated, its properties cannot be changed, but we can get these properties through the methods provided by the class URL:
Public String Getprotocol () Gets the protocol name for the URL.
Public String GetHost () gets the host name of the URL.
public int getport () Gets the port number of the URL, and returns 1 if no port is set.
Public String GetFile () Gets the file name of the URL.
Public String GetRef () Gets the relative position of the URL in the file.
Public String Getquery () Gets the query information for the URL.
Public String GetPath () Gets the path to the URL
Public String getauthority () Gets the permission information for the URL
Public String GetUserInfo () Gets the user's information
Public String GetRef () Gets the anchor for the URL

8.2.5 reading WWW network resources from a URL

When we get a URL object, we can read the specified WWW resource through it. At this point we will use the URL method OpenStream (), which is defined as: InputStream OpenStream (); Method Opensteam () establishes a connection to the specified URL and returns an object of the InputStream class to read data from this connection.

Package com.ljq.test;

Import Java.io.BufferedReader;
Import Java.io.InputStreamReader;
Import Java.net.URL;

public class Urlreader {

public static void Main (string[] args) throws Exception {
URL url = new URL ("http://www.cnblogs.com/linjiqin/");
BufferedReader in = new BufferedReader (New InputStreamReader (Url.openstream ()));
String Inputline;
while ((Inputline = In.readline ()) = null) {
System.out.println (Inputline);
}
In.close ();
}
}

8.2.6 Connect via urlconnetction www

Through the URL method OpenStream (), we can only read data from the network, if we also want to output data, such as to the server side of the CGI program to send some data, we must first establish a connection with the URL before it can read and write, At this point, we need to use the class URLConnection. CGI is a public gateway interface (Common Gateway Interface), it is the user browser and server-side applications to connect the interface, about CGI programming, readers refer to the book.

Class URLConnection is also defined in package java.net, which represents a communication connection between a Java program and a URL on a network. When a connection is established with a URL, the corresponding URLConnection object is generated first on a URL object through Method OpenConnection (). For example, the following program segment first generates an object that points to address http://www.cnblogs.com/linjiqin/, and then opens a connection on the URL object with OpenConnection (), returning a URLConnection object. If the connection process fails, a ioexception is generated

try{
URL netchinaren = new URL ("http://edu.chinaren.com/index.shtml");
Urlconnectonn TC = netchinaren.openconnection ();
}catch (malformedurlexception e) {//Create URL () object failed
...
}catch (IOException e) {//openconnection () failed
...
}

Class URLConnection provides a number of ways to set or get connection parameters, the most commonly used in programming is getInputStream () and Getourputstream (), which is defined as:
Inputsteram Getinputsteram ();
Outputsteram Getoutputstream ();
We can communicate with the remote object by returning the input/output stream. Look at the following example:

Package com.ljq.test;

Import Java.io.DataInputStream;
Import Java.io.PrintStream;
Import Java.net.URL;
Import java.net.URLConnection;

public class Urlreader {

public static void Main (string[] args) throws Exception {
Create a URL object
URL url=new url ("Http://www.javasoft.com/cgi-bin/backwards");
Gets the URLConnection object from the URL object
URLConnection conn=url.openconnection ();
Gets the input stream from URLConnection and constructs the DataInputStream object

Gets the output stream from URLConnection and constructs the PrintStream object
PrintStream ps=new PrintStream (Conn.getoutputstream ());

PS.PRINTLN ("Client ..."); Write out the string "client ..." to the server
}
}

Where backwards is the server-side CGI program. In fact, the method Opensteam () of the class URL is implemented by URLConnection. It is equivalent to OpenConnection (). getInputStream ();
URL-based network programming is actually based on the following socket interface. WWW,FTP and other standardized network services are based on TCP protocol, so in essence, URL programming is an application based on TCP.

8. 3 low-level Java network programming based on sockets
8.3.1 Socket Communication
The two programs on the network realize the exchange of data through a two-way communication connection, one end of this bidirectional link is called a socket. Sockets are typically used to connect clients and service parties. Sockets are a very popular programming interface for the TCP/IP protocol, and a socket is uniquely determined by an IP address and a port number.

In the traditional UNIX environment can operate TCP/IP protocol interface more than one socket, the socket supported by the type of protocol is not only a TCP/IP, so there is no inevitable connection between the two. In the Java environment, socket programming mainly refers to the network programming based on TCP/IP protocol.
8.3.2 The general process of socket communication
The general connection process for Client/server programming with sockets is that the server side listen (listens) for a connection request on a port, and the client sends a connect request to the server side. The server sends back the Accept message to the client side. A connection is built up. Both the server side and client side can communicate with each other through methods such as Send,write.
For a full-featured socket, the following basic structure is included, and the work process consists of the following four basic steps:
(1) Create socket;
(2) Open the input/output stream connected to the socket;
(3) Read/write the socket according to certain protocol;
(4) Close the socket.

8.3.3 Create Socket
Java provides two classes of sockets and ServerSocket in Package java.net, respectively, to represent the client and server side of a two-way connection. This is a two well-packaged class that is very handy to use. The method is constructed as follows:
Socket (inetaddress address, int port);
Socket (inetaddress address, int port, Boolean stream);
Socket (String host, int prot);
Socket (String host, int prot, Boolean stream);
Socket (SocketImpl impl)
Socket (String host, int port, inetaddress localaddr, int localport)
Socket ( inetaddress address, int port, inetaddress localaddr, int localport)
ServerSocket (int port);
ServerSocket (int port, int backlog);
ServerSocket (int port, int backlog, inetaddress bindaddr)
where address, host, and port are the IP address, hostname, and port number of the other side of the two-way connection, respectively. Stream indicates whether the socket is a stream socket or datagram Socket,localport represents the port number of the local host, and LOCALADDR and BINDADDR are the addresses of the local machine (ServerSocket's host address). Impl is the parent of the socket and can be used both to create serversocket and to create a socket. Count indicates the maximum number of connections that can be supported by the server. For example:

Socket client = new socket ("127.0.01.", 80);
ServerSocket Server = new ServerSocket (80);
Note that you must be careful when choosing a port. Each port provides a specific service, and only the correct port is given to obtain the appropriate service. The port number of the 0~1023 is reserved for the system, such as the port number of the HTTP service for the 80,telnet service port number is 23, so when we select the port number, it is best to select a number greater than 1023 to prevent a conflict.
If an error occurs when creating the socket, IOException will be generated and must be handled in the program. So when creating sockets or serversocket it is necessary to catch or throw exceptions

8.3.8 Simple Client/server Programming

Below we present a typical C/s structure of client and server interaction with the socket, and the reader will have a deeper understanding of the concepts discussed above by carefully reading the program. Please refer to the note for the meaning of the program.

1. Client program

2. Server-side Programs

Thinking before class
1. What is the TCP/IP protocol?
2. What are the two transport protocols for TCP/IP and what are the characteristics of each?
3. What is a URL?
4. What is the relationship between URL and IP address?
5. What is a socket (socket)?
6. What is the relationship between the socket and the TCP/IP protocol?
7. URL and socket (socket) relationship?
8. 1 Basic concepts of network programming, Introduction to TCP/IP protocol

8.1.1 Network Basics
The purpose of network programming is to communicate with other computers directly or indirectly through network protocols. There are two main problems in network programming, one is how to locate one or more hosts on the network accurately, and the other is how to reliably and efficiently transmit data after finding the host. In the TCP/IP protocol, it is mainly responsible for the location of the network host, the routing of data transmission, and the IP address can uniquely determine a host on the Internet. The TCP layer provides an application-oriented reliable or unreliable data transmission mechanism, which is the main object of network programming, and generally does not need to care about how the IP layer handles the data.
At present, the popular network programming model is the client/server (c/s) structure. That is, both sides of the communication are waiting for the client to request and respond as a server. The customer requests the server when the service is required. Server generally as a daemon always run, listen to the network port, once a customer request, will start a service process to respond to the customer, while continuing to monitor the service port, so that later customers can also be timely service.

8.1. Class 32 Transfer Protocol: TCP;UDP
Although TCP is the only protocol name in the TCP/IP protocol, TCP and UDP two protocols are present at the transport layer of TCP/IP.
TCP is the short name of Tranfer Control protocol and is a connection-oriented protocol that guarantees reliable transmission. With the TCP protocol transmission, a sequential error-free data stream is obtained. A connection must be established between the sender and the receiver's paired two sockets to communicate on the basis of the TCP protocol, and when a socket (usually a server socket) waits for a connection, the other socket can require a connection. Once the two sockets are connected, they can carry out two-way data transfer and both can send or receive operations.
UDP is the abbreviation of User Datagram protocol, is a non-connected protocol, each datagram is a separate information, including the full source address or destination address, it on the network with any possible path to the destination, so can reach the destination, The time to reach the destination and the correctness of the content are not guaranteed.
Here we make a simple comparison between the two protocols:
With UDP, the full address information is given in each datagram, so there is no need to establish a connection between the sender and the receiver. For the TCP protocol, since it is a connection-oriented protocol, it is necessary to establish a connection before data transfer between sockets, so there is more time to establish a connection in TCP.
There is a size limit for transmitting data using UDP, and each transmitted datagram must be limited to 64KB. TCP does not have this limitation, and once the connection is established, the sockets on both sides can transmit large amounts of data in a uniform format. UDP is an unreliable protocol in which datagrams sent by the sender do not necessarily reach the receiver in the same order. TCP is a reliable protocol that ensures that the receiver is getting all the data sent by the sender in full and proper order.
In short, TCP has strong vitality in network communications, such as remote Connection (Telnet) and file Transfer (FTP), which require the data to be reliably transmitted over an indefinite length. In contrast, UDP is easy to operate and requires less monitoring, so it is often used for client/server applications in decentralized systems with high LAN reliability.
Readers may want to ask why the UDP protocol is not reliably transmitted, since there is a TCP protocol that guarantees reliable transmission. There are two main reasons for this. First, reliable transmission is to pay a price, the correctness of the data content of the test must occupy the computer processing time and network bandwidth, so the efficiency of TCP transmission is not as high as UDP. Second, in many applications do not need to ensure strict transmission reliability, such as video conferencing system, does not require audio and video data is absolutely correct, as long as the consistency can be guaranteed, in this case, obviously using UDP is more reasonable.

8. 2 high-level Java network programming based on URLs

8.2.1 Consistent Resource Locator URL
A URL (Uniform Resource Locator) is the short name of a consistent resource locator that represents the address of a resource on the Internet. Through the URL we can access various network resources on the Internet, such as the most common www,ftp site. The browser can find the appropriate file or other resource on the network by parsing the given URL.
8.2.2 The composition of the URL

Protocol://resourcename
The Protocol name (protocol) indicates the transport protocol used to obtain the resource, such as HTTP, FTP, Gopher, file, and so on, and the Resource name (resourcename) should be the full address of the resource, including the hostname, port number, file name, or a reference inside the file. For example:
http://www.sun.com/protocol Name://Host Name
Http://home.netscape.com/home/welcome.html protocol Name://Machine name + file name
Http://www.gamelan.com:80/Gamelan/network.html#BOTTOM protocol Name://Machine name + port number + file name + Internal Reference

8.2.3 Create a URL

To represent the URL, the class URL is implemented in java.net. We can initialize a URL object by constructing the following method:
(1) Public URL (String spec);
A URL object can be constructed from a string that represents a URL address.
URL urlbase=new url ("http://www. 263.net/")
(2) Public URL (URL context, String spec);
Constructs a URL object from a base URL and a relative URL.
URL net263=new url ("http://www.263.net/");
URL index263=new url (net263, "index.html")
(3) Public URL (string protocol, string host, string file);
The new URL ("http", "www.gamelan.com", "/pages/gamelan.net"). HTML ");
(4) Public URL (string protocol, string host, int port, string file);
URL gamelan=new url ("http", "www.gamelan.com", "pages/gamelan.network.html");

Note: The constructor of the class URL declares that it discards the non-runtime exception (malformedurlexception), so when generating the URL object, we have to deal with this exception, usually with the Try-catch statement. The format is as follows:

try{
URL myurl= new URL (...)
}catch (Malformedurlexception e) {
...

}

8.2.4 parsing a URL
After a URL object is generated, its properties cannot be changed, but we can get these properties through the methods provided by the class URL:
Public String Getprotocol () Gets the protocol name for the URL.
Public String GetHost () gets the host name of the URL.
public int getport () Gets the port number of the URL, and returns 1 if no port is set.
Public String GetFile () Gets the file name of the URL.
Public String GetRef () Gets the relative position of the URL in the file.
Public String Getquery () Gets the query information for the URL.
Public String GetPath () Gets the path to the URL
Public String getauthority () Gets the permission information for the URL
Public String GetUserInfo () Gets the user's information
Public String GetRef () Gets the anchor for the URL

8.2.5 reading WWW network resources from a URL

When we get a URL object, we can read the specified WWW resource through it. At this point we will use the URL method OpenStream (), which is defined as: InputStream OpenStream (); Method Opensteam () establishes a connection to the specified URL and returns an object of the InputStream class to read data from this connection.

Package com.ljq.test;

Import Java.io.BufferedReader;
Import Java.io.InputStreamReader;
Import Java.net.URL;

public class Urlreader {

public static void Main (string[] args) throws Exception {
URL url = new URL ("http://www.cnblogs.com/linjiqin/");
BufferedReader in = new BufferedReader (New InputStreamReader (Url.openstream ()));
String Inputline;
while ((Inputline = In.readline ()) = null) {
System.out.println (Inputline);
}
In.close ();
}
}

8.2.6 Connect via urlconnetction www

Through the URL method OpenStream (), we can only read data from the network, if we also want to output data, such as to the server side of the CGI program to send some data, we must first establish a connection with the URL before it can read and write, At this point, we need to use the class URLConnection. CGI is a public gateway interface (Common Gateway Interface), it is the user browser and server-side applications to connect the interface, about CGI programming, readers refer to the book.

Class URLConnection is also defined in package java.net, which represents a communication connection between a Java program and a URL on a network. When a connection is established with a URL, the corresponding URLConnection object is generated first on a URL object through Method OpenConnection (). For example, the following program segment first generates an object that points to address http://www.cnblogs.com/linjiqin/, and then opens a connection on the URL object with OpenConnection (), returning a URLConnection object. If the connection process fails, a ioexception is generated

try{
URL netchinaren = new URL ("http://edu.chinaren.com/index.shtml");
Urlconnectonn TC = netchinaren.openconnection ();
}catch (malformedurlexception e) {//Create URL () object failed
...
}catch (IOException e) {//openconnection () failed
...
}

Class URLConnection provides a number of ways to set or get connection parameters, the most commonly used in programming is getInputStream () and Getourputstream (), which is defined as:
Inputsteram Getinputsteram ();
Outputsteram Getoutputstream ();
We can communicate with the remote object by returning the input/output stream. Look at the following example:

Package com.ljq.test;

Import Java.io.DataInputStream;
Import Java.io.PrintStream;
Import Java.net.URL;
Import java.net.URLConnection;

public class Urlreader {

public static void Main (string[] args) throws Exception {
Create a URL object
URL url=new url ("Http://www.javasoft.com/cgi-bin/backwards");
Gets the URLConnection object from the URL object
URLConnection conn=url.openconnection ();
Gets the input stream from URLConnection and constructs the DataInputStream object

Gets the output stream from URLConnection and constructs the PrintStream object
PrintStream ps=new PrintStream (Conn.getoutputstream ());

PS.PRINTLN ("Client ..."); Write out the string "client ..." to the server
}
}

Where backwards is the server-side CGI program. In fact, the method Opensteam () of the class URL is implemented by URLConnection. It is equivalent to OpenConnection (). getInputStream ();
URL-based network programming is actually based on the following socket interface. WWW,FTP and other standardized network services are based on TCP protocol, so in essence, URL programming is an application based on TCP.

8. 3 low-level Java network programming based on sockets
8.3.1 Socket Communication
The two programs on the network realize the exchange of data through a two-way communication connection, one end of this bidirectional link is called a socket. Sockets are typically used to connect clients and service parties. Sockets are a very popular programming interface for the TCP/IP protocol, and a socket is uniquely determined by an IP address and a port number.

In the traditional UNIX environment can operate TCP/IP protocol interface more than one socket, the socket supported by the type of protocol is not only a TCP/IP, so there is no inevitable connection between the two. In the Java environment, socket programming mainly refers to the network programming based on TCP/IP protocol.
8.3.2 The general process of socket communication
The general connection process for Client/server programming with sockets is that the server side listen (listens) for a connection request on a port, and the client sends a connect request to the server side. The server sends back the Accept message to the client side. A connection is built up. Both the server side and client side can communicate with each other through methods such as Send,write.
For a full-featured socket, the following basic structure is included, and the work process consists of the following four basic steps:
(1) Create socket;
(2) Open the input/output stream connected to the socket;
(3) Read/write the socket according to certain protocol;
(4) Close the socket.

8.3.3 Create Socket
Java provides two classes of sockets and ServerSocket in Package java.net, respectively, to represent the client and server side of a two-way connection. This is a two well-packaged class that is very handy to use. The method is constructed as follows:
Socket (inetaddress address, int port);
Socket (inetaddress address, int port, Boolean stream);
Socket (String host, int prot);
Socket (String host, int prot, Boolean stream);
Socket (SocketImpl impl)
Socket (String host, int port, inetaddress localaddr, int localport)
Socket ( inetaddress address, int port, inetaddress localaddr, int localport)
ServerSocket (int port);
ServerSocket (int port, int backlog);
ServerSocket (int port, int backlog, inetaddress bindaddr)
where address, host, and port are the IP address, hostname, and port number of the other side of the two-way connection, respectively. Stream indicates whether the socket is a stream socket or datagram Socket,localport represents the port number of the local host, and LOCALADDR and BINDADDR are the addresses of the local machine (ServerSocket's host address). Impl is the parent of the socket and can be used both to create serversocket and to create a socket. Count indicates the maximum number of connections that can be supported by the server. For example:

Socket client = new socket ("127.0.01.", 80);
ServerSocket Server = new ServerSocket (80);
Note that you must be careful when choosing a port. Each port provides a specific service, and only the correct port is given to obtain the appropriate service. The port number of the 0~1023 is reserved for the system, such as the port number of the HTTP service for the 80,telnet service port number is 23, so when we select the port number, it is best to select a number greater than 1023 to prevent a conflict.
If an error occurs when creating the socket, IOException will be generated and must be handled in the program. So when creating sockets or serversocket it is necessary to catch or throw exceptions

8.3.8 Simple Client/server Programming

Below we present a typical C/s structure of client and server interaction with the socket, and the reader will have a deeper understanding of the concepts discussed above by carefully reading the program. Please refer to the note for the meaning of the program.

1. Client program

2. Server-side Programs

Java Network programming

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.