Types of Sockets in Java
The fundamental idea behind Java's networking capability is the socket. Early in the 1980s, the Berkeley UNIX 4.2BSD version included the socket paradigm. Berkeley socket is the term employed as a result. The socket is the foundation of a contemporary network since it enables a single computer several clients at once and provide various types of data. And to do that, a port - an identified socket on a particular machine - is used. It is stated that the server process "listens" to a port. up until the client establishes a connection with the server. Multiple clients may connect to the same port on the server, but only one client may be active at a time. A multi-threaded server process is necessary to manage several client connections.
Protocol is used to establish socket connections. A low-level routing protocol called Internet Protocol (IP) divides data into individual packets and sends them over the network to a specific address. However, there is no assurance that the packets will arrive at their destination as a result of this. Another higher-level protocol called Transmission Control Protocol (TCP) is able to link together these packets robustly and sort and retransmit them as necessary for a reliable data transmission. User Datagram Protocol (UDP), a third protocol, can be immediately applied to provide quick, unreliable, offline packet transfers.
The higher-level protocol that follows connection establishment depends on the port you are using. The first 1,024 ports are reserved for TCP/IP for some protocols. And many of these may sound extremely familiar to you if you've been using the Internet for a while. Telnet uses port number 23, FTP uses port 21, whose uses port 43, email uses port 25, HTTP uses port 80, finger uses port 79, netnews uses port 119, and so on. Each protocol specifies the manner in which the client should communicate with the port.
Types of Sockets in Java
The following three socket types are supported by Java:
- Stream Sockets
- Datagram Sockets
- Raw Sockets
Stream Sockets
Using TCP, processes can communicate thanks to Stream Sockets. A dependable, two-way, unrepeated, sequential stream of data without record boundaries is offered by stream sockets. The socket is connection-oriented. These sockets allow for the reading and writing of data as streams of bytes once a connection has been made. SOCK STREAM is the socket type.
When a secure connection is required for two network programmes sending and receiving numerous messages, stream sockets are employed. TCP is used by stream sockets to guarantee error-free delivery of messages to their destinations. In reality, IP packets are frequently misdirected or lost in the network. In either case, the IP packet is resent by the receiving TCP after connecting to the issuing TCP. Each stream socket has two are now connected securely as a result of this.
The client/server applications require the use of stream sockets. The client programme tries to build a stream socket object containing the host IP address of a server programme, the server program's port number (i.e., a network-aware application that needs access to a service) (that is, a network-aware programme that provides a service to client programs). The network management software on the client host receives the IP address and port number from the stream socket initialization code in the client programme.
This software uses IP to provide the server host's IP address and port number via NIC. In an effort to confirm that the server programme is accepting the stream socket's connection requests on the designated port, network management software at the server host tries to retrieve data (via IP) from the NIC. If the server programme is listening, the network management software on the host server will react to the network management software on the client host with a positive acknowledgement.
The server program's stream socket receives the client program's stream socket initialization code, establishes a port number for the client programme, passes the port number to the stream socket of the server application, which utilises that number to distinguish the client.
The stream socket initialization code for the client application responds by throwing an exception object and failing to open a channel of communication (It does not produce an object for a stream socket.)
TCP/IP Client Sockets
To build dependable streaming connections that are two-way, persistent, and point-to-point between hosts on the Internet, TCP/IP sockets are employed. Sockets can be used by the Java I/O system to connect to other programmes running locally or on remote systems connected to the Internet. It's crucial to remember that the applet creates a unidirectional socket connection with the host on which it is loaded. Because it is risky for applets loaded access arbitrary systems via a firewall, this restriction is in place. In Java, there are two different TCP socket types.
One is for the client, the other is for the server. When a client connects, the ServerSocket class acts as a "listener" and does nothing else. ServerSocket is therefore for servers. For clients, there is the Socket class. It's intended to establish a connection with launch from a server socket a protocol exchange. This is due to the fact that Java applications most frequently employ client sockets. connecting the client and server is automatically established when a Socket object is created. No function Object() { [native code] } or method explicitly exposes information about how to set up this connection.
The two constructors that are used to build a client socket are as follows:
- IOException is thrown by Socket(InetAddress, ipAddress, int port): Uses a port and an existing InetAddress object to create a socket.
- UnknownHostException, IOException are thrown by the function socket(String hostName, int port),: which creates a socket connected to the supplied host and port.
Different instance methods are defined by socket. A socket can always use the techniques listed below to lookup associated address and port information.
- int getPort(): It gives back the remote port that the invoked Socket object is attached to. In the absence of a connected socket, it returns 0.
- int getLocalPort(): the local port that the calling Socket object is linked to is returned. If the socket is unbound, it gives back -1.
- InetAddress getInetAddress(): It gives back the InetAddress connected to the Socket object. In the absence of a connected socket, it returns null.
- InputStream getInputStream() throws IOException: Gets the InputStream connected to the socket that is invoking the command.
- OutputStream getOutputStream( ) throws IOException: gives back the OutputStream connected to the calling socket.
- connect( ): allows for the specification of a new connection
- isConnected( ): If a server connection is present, the function returns true.
- isBound( ): if the socket is connected to an address, it returns true.
- isClosed( ): If the socket is shut, the function returns true.
A straightforward socket example is provided by the programme below. opens a connection to the InterNIC server's "whois" port (port 43), gives a command-line input to the socket, then publishes the results. The InterNIC will attempt to locate the dispute using the Internet domain name that is registered before returning the IP address and contact details for that website.
import java.net.*;
import java.io.*;
public class WhoisClient {
public static void main(String[] args) {
if (args.length < 1)
return;
String domainName = args[0];
String hostname = "whois.internic.net";
int port = 43;
try (Socket socket = new Socket(hostname, port)) {
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
writer.println(domainName);
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
catch (UnknownHostException ex)
{
System.out.println("Server not found: " + ex.getMessage());
}
catch (IOException ex) {
System.out.println("I/O error: " + ex.getMessage());
}
}
}
Expected Output:
WhoisClient
The programme operates as follows. To begin, the socket is built with the host name "internic.net" and port number 43, which is a website that responds to port 43 whois requests. Additionally, the socket opens up for both streams, both input and output.The string that comprises the name of the website from which we wish to obtain information is then created. The outcome is displayed once through socket input, the response is read.
Datagram Sockets
Datagram sockets let processes communicate using UDP. Bidirectional message flow is supported using datagram sockets. It is a socket without a connection. It is possible for a datagram socket process to receive duplicate messages as well as messages in a different order from the one in which they were transmitted. The data's record boundaries are still present. SOCK DGRAM is the socket type.
The majority of networking requirements can be met by TCP/IP-style networking. It offers a stream of packet data that is serialised, predictable, and trustworthy. But there is a price to this. TCP uses numerous cutting-edge algorithms to handle congestion control on congested networks and to prepare for the worst-case scenario of packet loss. This results in a fairly ineffective method of data transportation. Datagrams offer a different option.
Large volumes of information are sent between machines called datagrams. There is no assurance that the datagram will arrive or perhaps that someone will be there to grab it once it has been released for its intended use. Similar to this, there is no assurance that the datagram was not harmed in transit or that the sender is still present to receive a response when it is received.
Java uses two classes to construct Adding datagrams to the UDP protocol: the DatagramPacket object serves as the data container and the DatagramSocket provides the means of sending or receiving datagram packets.
Four public constructors are defined by DatagramSocket. Here are a few of them:
- Creates a Datagram socket linked to any open port on the local machine, however DatagramSocket() produces SocketException instead.
- (int Port) DatagramSocket throws A DatagramSocket is created with the SocketException exception and is bound to the port given by the port.
- DatagramSocket(int port, InetAddress ipAddress), which constructs a DatagramSocket bound to the supplied port and InetAddress, throws a SocketException.
- Constructs a DatagramSocket bound to the supplied SocketAddress. DatagramSocket(SocketAddress address) throws SocketException. The concrete class InetSocketAddress implements the abstract class SocketAddress. In InetSocketAddress, an IP address and port number are combined. If a problem arises during the socket creation process, any user may throw a SocketException.
Many methods are defined by DatagramSocket. Here, the functions send() and receive()—two of the most crucial—are displayed:
- IOException is thrown by the void send() method, which sends the packet to the port indicated by the DatagramPacket packet.
- The function void receive(DatagramPacket packet) throws an IOException and waits for a packet to be received from the port that the packet specifies before returning the outcome.
You can access additional methods that provide you access to different DatagramSocket characteristics.
Here are several examples:
- InetAddress getInetAddress(): The address is returned if the socket is established. If not, null is returned.
- int getLocalPort() of type returns the local port's number.
- Gets the port number that the socket is connected to using the int getPort() method. If the socket is not connected to a port, it returns -1.
- The function isBound(), which returns true if the socket is bound to an address, checks this. Otherwise, it returns false.
- If the socket is linked to a server, the boolean isConnected() function will return true. Alternatively, it returns false.
- sets void It throws SoTimeout(int millis). The time-out period is set to the amount of milliseconds that have elapsed in millis due to the SocketException.
Datagram Packet
Multiple constructors are defined by DatagramPacket. Here are four of them:
- DatagramPacket(byte data[], int size]) specifies the size of a packet as well as a buffer that will accept the data. It is employed for DatagramSocket data reception.
- We can define an offset within the buffer at which data will be put using DatagramPacket(byte data[], int offset, and int size).
- It specifies a destination address and port that a DatagramSocket will use to decide where the data in the packet will be transmitted. DatagramPacket(byte data[], int size, InetAddress ipAddress, int port)
- Transmits packets starting at the provided offset into the data using the following syntax: DatagramPacket(byte data[], int offset, int size, InetAddress ipAddress, int port).
Raw Sockets
Access to ICMP (Internet Control Message Protocol) is made possible using raw sockets. The exact nature of these sockets, which are often datagram-oriented, depends on the protocol's given interface. Most applications do not suit raw sockets. It is offered to aid in the creation to gain more information about new communication protocols intricate parts of protocols already in use. Raw sockets can only be used by root processes. The type of socket is SOCK RAW.
The address is the primary component of the Internet. On the Internet, each computing gadget has a personal one. Each Internet-connected computer has a specific identification number called an Internet address. At first, every Internet address was a 32-bit value, or four 8-bit values. This kind of address is defined by IPv4 (Internet Protocol, version 4). However, IPv6 (Internet Protocol, version 6) is a new address scheme that has already been implemented.