JDK Tutorials - Herong's Tutorial Examples - v6.32, by Herong Yang
ReverseEchoServer.java - A Multi-Connection Socket Server
This section provides a tutorial example on how to write a network application, ReverseEchoServer.java, that creates a server socket and listens for multiple remote socket connection requests. It creates a new execution thread each time, for each new connection.
ReverseEchoer runs perfectly if there is only one client program talking to it. If we run another copy of SocketClient, while a copy of SocketClient is running and connected to ReverseEchoer, the second copy of SocketClient will not be able establish a communication link with ReverseEchoer, because it is busy with the first copy of SocketClient.
To create a server application that can handle multiple connections, a new execution thread needs to be created for each connection. The following program, called ReverseEchoServer, offers the same function to client program. But it can handle multiple connections.
/* ReverseEchoServer.java * Copyright (c) HerongYang.com. All Rights Reserved. */ import java.io.*; import java.net.*; public class ReverseEchoServer implements Runnable { private Socket con = null; public static void main(String[] args) { try { ServerSocket s = new ServerSocket(8888); printServerSocketInfo(s); while (true) { Socket c = s.accept(); printSocketInfo(c); ReverseEchoServer v = new ReverseEchoServer(c); Thread t = new Thread(v); t.start(); } } catch (IOException e) { System.err.println(e.toString()); } } public ReverseEchoServer(Socket c){ con = c; } public void run() { try { BufferedWriter w = new BufferedWriter(new OutputStreamWriter( con.getOutputStream())); BufferedReader r = new BufferedReader(new InputStreamReader( con.getInputStream())); String m = "Welcome to Reverse Echo Server."+ " Please type in some words."; w.write(m,0,m.length()); w.newLine(); w.flush(); while ((m=r.readLine())!= null) { if (m.equals(".")) break; char[] a = m.toCharArray(); int n = a.length; for (int i=0; i<n/2; i++) { char t = a[i]; a[i] = a[n-1-i]; a[n-i-1] = t; } w.write(a,0,n); w.newLine(); w.flush(); } w.close(); r.close(); con.close(); } catch (IOException e) { System.err.println(e.toString()); } } private static void printSocketInfo(Socket s) { System.out.println("Remote address = " +s.getInetAddress().toString()); System.out.println("Remote port = " +s.getPort()); System.out.println("Local socket address = " +s.getLocalSocketAddress().toString()); System.out.println("Local address = " +s.getLocalAddress().toString()); System.out.println("Local port = " +s.getLocalPort()); } private static void printServerSocketInfo(ServerSocket s) { System.out.println("Server socket address = " +s.getInetAddress().toString()); System.out.println("Server socket port = " +s.getLocalPort()); } }
Here is the output displayed on the ReverseEchoServer console window, with two copies of SocketClient running:
herong> java ReverseEchoServer.java Server socket address = 0.0.0.0/0.0.0.0 Server socket port = 8888 Remote address = /127.0.0.1 Remote port = 1084 Local socket address = /127.0.0.1:8888 Local address = /127.0.0.1 Local port = 8888 Remote address = /127.0.0.1 Remote port = 1085 Local socket address = /127.0.0.1:8888 Local address = /127.0.0.1 Local port = 8888
Table of Contents
Date, Time and Calendar Classes
Date and Time Object and String Conversion
Number Object and Numeric String Conversion
Locales, Localization Methods and Resource Bundles
Calling and Importing Classes Defined in Unnamed Packages
HashSet, Vector, HashMap and Collection Classes
Character Set Encoding Classes and Methods
Encoding Conversion Programs for Encoded Text Files
Establishing a Socket Communication Link
ReverseEchoer.java - A Simple Server Socket Application
SocketClient.java - A Simple Client Socket Application
►ReverseEchoServer.java - A Multi-Connection Socket Server
Binding Sockets to Specific Ports
Datagram Network Communication
DOM (Document Object Model) - API for XML Files
DTD (Document Type Definition) - XML Validation
XSD (XML Schema Definition) - XML Validation
XSL (Extensible Stylesheet Language)
Message Digest Algorithm Implementations in JDK
Private key and Public Key Pair Generation
PKCS#8/X.509 Private/Public Encoding Standards
Digital Signature Algorithm and Sample Program
"keytool" Commands and "keystore" Files
KeyStore and Certificate Classes
Secret Key Generation and Management
Cipher - Encryption and Decryption
The SSL (Secure Socket Layer) Protocol
SSL Socket Communication Testing Programs