Introduction
In this article, I will describe the steps to make a connection in Java using Sockets. Let's start to understand what is a communication created via TCP/IP... A communication link created via TCP/IP sockets is a connection-oriented link. This means that the connection between the server and client remains open throughout the duration of the dialogue between the two and is only broken (under normal circumstances) when one end of the dialogue formally terminates the exchanges (via an agreed protocol).
Using the Code
- Create a
ServerSocket
object:
ServerSocket mySock = new ServerSocket(1234);
Here the server will wait ("listen for") a connection from a client on port 1234
.
- Put the server into a waiting state:
Socket link = mySock.accept();
Here the server waits indefinitely("blocks") for a client to connect with the help of accept
method of class ServerSocket
, class that will return a Socket
object when a connection is made.
- Set up input and output streams.
Let's examine two methods: getInputStream
and getOuputStream
of class Socket
. These methods are used to get references to streams associated with the socket returned in step 2.
You will use these streams later for communication with a client that has just made a connection. If you are not using a GUI application, you can wrap a Scanner
object around the InputStream
object, object that is returned by method getInputStream
, in order to obtain string
-oriented input, let's see how:
Scanner input = new Scanner(link.getInputStream());
At the same time, we can wrap a PrintWriter
object around the OutputStream
object returned by method getOutputStream
. We supply the PrintWriter
constructor with a second argument of true
. This argument will cause the output buffer to be flushed for every call of println
, let's see how:
PrintWriter output = new PrintWriter(link.getOutputStream(),true);
- Send and receive data.
After you have set up your Scanner
and PrintWriter
objects, to send data and to receive is very straightforward. For this, we have to use nextLine
method for receiving data and println
to send data, let's see how:
output.println("Awaiting data...");
String input = input.nextLine();
- Close the connection (after completion of the dialogue):
link.close();
Look at this code :
public class TCPEchoServer
{
private static ServerSocket servSock;
private static final int PORT = 1234;
public static void main(String[] args)
{
System.out.println("Opening port...\n");
try
{
servSock = new ServerSocket(PORT);
}
catch(IOException ioEx)
{
System.out.println("Unable to attach to port!");
System.exit(1);
}
do
{
handleClient();
}
while (true);
}
private static void handleClient()
{
Socket link = null;
try
{
link = servSock.accept();
Scanner input = new Scanner(link.getInputStream());
PrintWriter output =
new PrintWriter(link.getOutputStream(),true);
int numMessages = 0;
String message = input.nextLine();
while (!message.equals("***CLOSE***"))
{
System.out.println("Message received.");
numMessages++;
output.println("Message " +
numMessages + ": " + message);
message = input.nextLine();
}
output.println(numMessages + " messages received.");
}
catch(IOException ioEx)
{
ioEx.printStackTrace();
}
finally
{
try
{
System.out.println( "\n* Closing connection... *");
link.close();
}
catch(IOException ioEx)
{
System.out.println("Unable to disconnect!");
System.exit(1);
}
}
}
}
History
This example represents the SERVER
program. In the next article (JavaSocketsClient.aspx), I will describe the CLIENT
program, which is almost the same.
History
- 24th March, 2008: Initial post