Java/Network Protocol/Socket

Материал из Java эксперт
Перейти к: навигация, поиск

A simple network client that establishes a network connection to a specified port on a specified host, send an optional message across the connection

   <source lang="java">
    

/*

* Copyright (c) 2004 David Flanagan.  All rights reserved.
* This code is from the book Java Examples in a Nutshell, 3nd Edition.
* It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
* You may study, use, and modify it for any non-commercial purpose,
* including teaching and use in open-source projects.
* You may distribute it non-commercially as long as you retain this notice.
* For a commercial use license, or to purchase the book, 
* please visit http://www.davidflanagan.ru/javaexamples3.
*/

//package je3.net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketTimeoutException; /**

* A simple network client that establishes a network connection to a specified
* port on a specified host, send an optional message across the connection,
* reads the response from the server and exits. A suitable client for simple
* network services like the daytime or finger.
*/

public class Connect {

 public static void main(String[] args) {
   try { // Handle exceptions below
     // Get our command-line arguments
     String hostname = args[0];
     int port = Integer.parseInt(args[1]);
     String message = "";
     if (args.length > 2)
       for (int i = 2; i < args.length; i++)
         message += args[i] + " ";
     // Create a Socket connected to the specified host and port.
     Socket s = new Socket(hostname, port);
     // Get the socket output stream and wrap a PrintWriter around it
     PrintWriter out = new PrintWriter(s.getOutputStream());
     // Sent the specified message through the socket to the server.
     out.print(message + "\r\n");
     out.flush(); // Send it now.
     // Get an input stream from the socket and wrap a BufferedReader
     // around it, so we can read lines of text from the server.
     BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
     // Before we start reading the server"s response tell the socket
     // that we don"t want to wait more than 3 seconds
     s.setSoTimeout(3000);
     // Now read lines from the server until the server closes the
     // connection (and we get a null return indicating EOF) or until
     // the server is silent for 3 seconds.
     try {
       String line;
       while ((line = in.readLine()) != null)
         // If we get a line
         System.out.println(line); // print it out.
     } catch (SocketTimeoutException e) {
       // We end up here if readLine() times out.
       System.err.println("Timeout; no response from server.");
     }
     out.close(); // Close the output stream
     in.close(); // Close the input stream
     s.close(); // Close the socket
   } catch (IOException e) { // Handle IO and network exceptions here
     System.err.println(e);
   } catch (NumberFormatException e) { // Bad port number
     System.err.println("You must specify the port as a number");
   } catch (ArrayIndexOutOfBoundsException e) { // wrong # of args
     System.err.println("Usage: Connect <hostname> <port> message...");
   }
 }

}



 </source>
   
  
 
  



A timeout feature on socket connections

   <source lang="java">
   

import java.io.IOException; import java.io.InterruptedIOException; import java.net.InetAddress; import java.net.Socket; /**

* This class offers a timeout feature on socket connections.
* A maximum length of time allowed for a connection can be 
* specified, along with a host and port.
*
* @author David Reilly (written for JavaWorld)
* @author Daniel Matuschek
* @version $Id: TimedSocket.java,v 1.2 2002/05/31 14:45:56 matuschd Exp $
*
* imported to the net.matuschek.util source tree by Daniel Matuschek 
*/

public class TimedSocket {

 /**
  * Attempts to connect to a service at the specified address
  * and port, for a specified maximum amount of time.
  *
  * @param addr  Address of host
  * @param port  Port of service
  * @param delay Delay in milliseconds
  */
 public static Socket getSocket ( InetAddress addr, int port, int delay) 
   throws InterruptedIOException, IOException
 {
   // Create a new socket thread, and start it running
   SocketThread st = new SocketThread( addr, port );
   st.start();
   
   int timer = 0;
   Socket sock = null;
   
   for (;;) {
     // Check to see if a connection is established
     
     if (st.isConnected()) {
 // Yes ...  assign to sock variable, and break out of loop
 sock = st.getSocket();
 break;
     } else {
 // Check to see if an error occurred
 if (st.isError()) {
   // No connection could be established
   throw (st.getException());
 }
 
 try {
   // Sleep for a short period of time
   Thread.sleep ( POLL_DELAY );
 } catch (InterruptedException ie) {}
 
 // Increment timer
 timer += POLL_DELAY;
 
 // Check to see if time limit exceeded
 if (timer > delay) {
   // Can"t connect to server
   throw new InterruptedIOException("Could not connect for " + 
            delay + " milliseconds");
 }
     }
   }
   
   return sock;
 }
 
 /**
  * Attempts to connect to a service at the specified address
  * and port, for a specified maximum amount of time.
  *
  * @param host  Hostname of machine
  * @param port  Port of service
  * @param delay Delay in milliseconds
  */
 public static Socket getSocket ( String host, int port, int delay) 
   throws InterruptedIOException, IOException
 {
   // Convert host into an InetAddress, and call getSocket method
   InetAddress inetAddr = InetAddress.getByName (host);
   
   return getSocket ( inetAddr, port, delay );
 }
 
 
 /**
  * Inner class for establishing a socket thread
  * within another thread, to prevent blocking.
  */
 static class SocketThread extends Thread
 {
   // Socket connection to remote host
   volatile private Socket m_connection = null;
   // Hostname to connect to
   private String m_host       = null;
   // Internet Address to connect to
   private InetAddress m_inet  = null;
   // Port number to connect to
   private int    m_port       = 0;
   // Exception in the event a connection error occurs
   private IOException m_exception = null;
   
   // Connect to the specified host and port number
   public SocketThread ( String host, int port) {
     // Assign to member variables
     m_host = host;
     m_port = port;
   }
   
   // Connect to the specified host IP and port number
   public SocketThread ( InetAddress inetAddr, int port ) {
     // Assign to member variables
     m_inet = inetAddr;
     m_port = port;
   }
   
   public void run() {
     // Socket used for establishing a connection
     Socket sock = null;
     
     try {
 // Was a string or an inet specified
 if (m_host != null) {
   // Connect to a remote host - BLOCKING I/O
   sock = new Socket (m_host, m_port);
 } else {
   // Connect to a remote host - BLOCKING I/O
   sock = new Socket (m_inet, m_port);
 }
     }
     catch (IOException ioe) {
 // Assign to our exception member variable
 m_exception = ioe;
 return;
     }
     // If socket constructor returned without error,
     // then connection finished
     m_connection = sock;
   }
   // Are we connected?
   public boolean isConnected() {
     if (m_connection == null)
 return false;
     else
 return true;
   }
   // Did an error occur?
   public boolean isError() {
     if (m_exception == null)
 return false;
     else
 return true;
   }
   // Get socket
   public Socket getSocket() {
     return m_connection;
   }
   
   // Get exception
   public IOException getException() {
     return m_exception;
   }
 }
 
 /** Polling delay for socket checks (in milliseconds) */
 private static final int POLL_DELAY = 100;

}



 </source>
   
  
 
  



Connects to a server at a specified host and port. It reads text from the console and sends it to the server

   <source lang="java">
    

/*

* Copyright (c) 2004 David Flanagan.  All rights reserved.
* This code is from the book Java Examples in a Nutshell, 3nd Edition.
* It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
* You may study, use, and modify it for any non-commercial purpose,
* including teaching and use in open-source projects.
* You may distribute it non-commercially as long as you retain this notice.
* For a commercial use license, or to purchase the book, 
* please visit http://www.davidflanagan.ru/javaexamples3.
*/

//package je3.net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.net.Socket; /**

* This program connects to a server at a specified host and port. It reads text
* from the console and sends it to the server. It reads text from the server
* and sends it to the console.
*/

public class GenericClient {

 public static void main(String[] args) throws IOException {
   try {
     // Check the number of arguments
     if (args.length != 2)
       throw new IllegalArgumentException("Wrong number of args");
     // Parse the host and port specifications
     String host = args[0];
     int port = Integer.parseInt(args[1]);
     // Connect to the specified host and port
     Socket s = new Socket(host, port);
     // Set up streams for reading from and writing to the server.
     // The from_server stream is final for use in the inner class below
     final Reader from_server = new InputStreamReader(s.getInputStream());
     PrintWriter to_server = new PrintWriter(s.getOutputStream());
     // Set up streams for reading from and writing to the console
     // The to_user stream is final for use in the anonymous class below
     BufferedReader from_user = new BufferedReader(new InputStreamReader(System.in));
     // Pass true for auto-flush on println()
     final PrintWriter to_user = new PrintWriter(System.out, true);
     // Tell the user that we"ve connected
     to_user.println("Connected to " + s.getInetAddress() + ":" + s.getPort());
     // Create a thread that gets output from the server and displays
     // it to the user. We use a separate thread for this so that we
     // can receive asynchronous output
     Thread t = new Thread() {
       public void run() {
         char[] buffer = new char[1024];
         int chars_read;
         try {
           // Read characters from the server until the
           // stream closes, and write them to the console
           while ((chars_read = from_server.read(buffer)) != -1) {
             to_user.write(buffer, 0, chars_read);
             to_user.flush();
           }
         } catch (IOException e) {
           to_user.println(e);
         }
         // When the server closes the connection, the loop above
         // will end. Tell the user what happened, and call
         // System.exit(), causing the main thread to exit along
         // with this one.
         to_user.println("Connection closed by server.");
         System.exit(0);
       }
     };
     // Now start the server-to-user thread
     t.start();
     // In parallel, read the user"s input and pass it on to the server.
     String line;
     while ((line = from_user.readLine()) != null) {
       to_server.print(line + "\r\n");
       to_server.flush();
     }
     // If the user types a Ctrl-D (Unix) or Ctrl-Z (Windows) to end
     // their input, we"ll get an EOF, and the loop above will exit.
     // When this happens, we stop the server-to-user thread and close
     // the socket.
     s.close();
     to_user.println("Connection closed by client.");
     System.exit(0);
   }
   // If anything goes wrong, print an error message
   catch (Exception e) {
     System.err.println(e);
     System.err.println("Usage: java GenericClient <hostname> <port>");
   }
 }

}



 </source>
   
  
 
  



Create a socket with a timeout

   <source lang="java">
    

import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; public class Main {

 public static void main(String[] argv) throws Exception {
   InetAddress addr = InetAddress.getByName("java.sun.ru");
   int port = 80;
   SocketAddress sockaddr = new InetSocketAddress(addr, port);
   Socket sock = new Socket();
   int timeoutMs = 2000;
   sock.connect(sockaddr, timeoutMs);
 }

}



 </source>
   
  
 
  



Create a socket without a timeout

   <source lang="java">
    

import java.net.InetAddress; import java.net.Socket; public class Main {

 public static void main(String[] argv) throws Exception {
   InetAddress addr = InetAddress.getByName("java.sun.ru");
   int port = 80;
   Socket socket = new Socket(addr, port);
 }

}



 </source>
   
  
 
  



Create PrintWriter from BufferedWriter, OutputStreamWriter and Socket

   <source lang="java">
    

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; public class Main {

 public static void main(String[] arges) throws Exception {
   InetAddress addr = InetAddress.getByName(null);
   Socket sk = new Socket(addr, 8888);
   BufferedReader in = new BufferedReader(new InputStreamReader(sk.getInputStream()));
   PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())), true);
   out.println("asdf");
   System.out.println(in.readLine());
 }

}



 </source>
   
  
 
  



deleting messages from a POP3 mailbox based on message size and Subject line

   <source lang="java">
    

/*

* Copyright (c) 2004 David Flanagan.  All rights reserved.
* This code is from the book Java Examples in a Nutshell, 3nd Edition.
* It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
* You may study, use, and modify it for any non-commercial purpose,
* including teaching and use in open-source projects.
* You may distribute it non-commercially as long as you retain this notice.
* For a commercial use license, or to purchase the book, 
* please visit http://www.davidflanagan.ru/javaexamples3.
*/

//package je3.net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; /**

* A simple utility program for deleting messages from a POP3 mailbox based on
* message size and Subject line. Don"t run this program unless you understand
* what it is doing. It deletes e-mail without downloading it: YOU MAY
* PERMANENTLY LOSE DATA!
* 
* Typical usage: 1) Look at the subject lines for the big messages you"ve got
* java PopClean -host host -user user -pass pass -size 100000
* 
* 2) Create a regular expression to match viral subject lines, and use it to
* delete large matching messages java PopClean -host h -user u -pass p -delete
* -size 100000 \ -subject "Thank you!|Re: Your application" This will ask for
* confirmation before proceeding.
* 
* 3) If you"re confident that all big messages are virus-infected, then you can
* skip the -subject argument and delete on size alone java PopClean -host h
* -user u -pass p -delete -size 100000 This will ask for confirmation before
* proceeding.
*/

public class PopClean {

 static Socket s = null; // The connection to the server
 static BufferedReader in = null; // To read lines from the server
 static PrintWriter out = null; // To write to the server
 static boolean debug = false; // Are we in debug mode?
 public static void main(String args[]) {
   try {
     String hostname = null, username = null, password = null;
     int port = 110;
     int sizelimit = -1;
     String subjectPattern = null;
     Pattern pattern = null;
     Matcher matcher = null;
     boolean delete = false;
     boolean confirm = true;
     // Handle command-line arguments
     for (int i = 0; i < args.length; i++) {
       if (args[i].equals("-user"))
         username = args[++i];
       else if (args[i].equals("-pass"))
         password = args[++i];
       else if (args[i].equals("-host"))
         hostname = args[++i];
       else if (args[i].equals("-port"))
         port = Integer.parseInt(args[++i]);
       else if (args[i].equals("-size"))
         sizelimit = Integer.parseInt(args[++i]);
       else if (args[i].equals("-subject"))
         subjectPattern = args[++i];
       else if (args[i].equals("-debug"))
         debug = true;
       else if (args[i].equals("-delete"))
         delete = true;
       else if (args[i].equals("-force")) // don"t confirm
         confirm = false;
     }
     // Verify them
     if (hostname == null || username == null || password == null || sizelimit == -1)
       usage();
     // Make sure the pattern is a valid regexp
     if (subjectPattern != null) {
       pattern = Pattern.rupile(subjectPattern);
       matcher = pattern.matcher("");
     }
     // Say what we are going to do
     System.out.println("Connecting to " + hostname + " on port " + port + " with username "
         + username + ".");
     if (delete) {
       System.out.println("Will delete all messages longer than " + sizelimit + " bytes");
       if (subjectPattern != null)
         System.out.println("that have a subject matching: [" + subjectPattern + "]");
     } else {
       System.out.println("Will list subject lines for messages " + "longer than " + sizelimit
           + " bytes");
       if (subjectPattern != null)
         System.out.println("that have a subject matching: [" + subjectPattern + "]");
     }
     // If asked to delete, ask for confirmation unless -force is given
     if (delete && confirm) {
       System.out.println();
       System.out.print("Do you want to proceed (y/n) [n]: ");
       System.out.flush();
       BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
       String response = console.readLine();
       if (!response.equals("y")) {
         System.out.println("No messages deleted.");
         System.exit(0);
       }
     }
     // Connect to the server, and set up streams
     s = new Socket(hostname, port);
     in = new BufferedReader(new InputStreamReader(s.getInputStream()));
     out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
     // Read the welcome message from the server, confirming it is OK.
     System.out.println("Connected: " + checkResponse());
     // Now log in
     send("USER " + username); // Send username, wait for response
     send("PASS " + password); // Send password, wait for response
     System.out.println("Logged in");
     // Check how many messages are waiting, and report it
     String stat = send("STAT");
     StringTokenizer t = new StringTokenizer(stat);
     System.out.println(t.nextToken() + " messages in mailbox.");
     System.out.println("Total size: " + t.nextToken());
     // Get a list of message numbers and sizes
     send("LIST"); // Send LIST command, wait for OK response.
     // Now read lines from the server until we get . by itself
     List msgs = new ArrayList();
     String line;
     for (;;) {
       line = in.readLine();
       if (line == null)
         throw new IOException("Unexpected EOF");
       if (line.equals("."))
         break;
       msgs.add(line);
     }
     // Now loop through the lines we read one at a time.
     // Each line should specify the message number and its size.
     int nummsgs = msgs.size();
     for (int i = 0; i < nummsgs; i++) {
       String m = (String) msgs.get(i);
       StringTokenizer st = new StringTokenizer(m);
       int msgnum = Integer.parseInt(st.nextToken());
       int msgsize = Integer.parseInt(st.nextToken());
       // If the message is too small, ignore it.
       if (msgsize <= sizelimit)
         continue;
       // If we"re listing messages, or matching subject lines
       // find the subject line for this message
       String subject = null;
       if (!delete || pattern != null) {
         subject = getSubject(msgnum); // get the subject line
         // If we couldn"t find a subject, skip the message
         if (subject == null)
           continue;
         // If this subject does not match the pattern, then
         // skip the message
         if (pattern != null) {
           matcher.reset(subject);
           if (!matcher.matches())
             continue;
         }
         // If we are listing, list this message
         if (!delete) {
           System.out.println("Subject " + msgnum + ": " + subject);
           continue; // so we never delete it
         }
       }
       // If we were asked to delete, then delete the message
       if (delete) {
         send("DELE " + msgnum);
         if (pattern == null)
           System.out.println("Deleted message " + msgnum);
         else
           System.out.println("Deleted message " + msgnum + ": " + subject);
       }
     }
     // When we"re done, log out and shutdown the connection
     shutdown();
   } catch (Exception e) {
     // If anything goes wrong print exception and show usage
     System.err.println(e);
     usage();
     // Always try to shutdown nicely so the server doesn"t hang on us
     shutdown();
   }
 }
 // Explain how to use the program
 public static void usage() {
   System.err.println("java PopClean <options>");
   System.err.println("Options are:\n" + "-host <hostname>  # Required\n"
       + "-port <port>      # Optional; default is 110\n" + "-user <username>  # Required\n"
       + "-pass <password>  # Required and sent as cleartext; APOP not supported\n"
       + "-size <limit>     # Message size in bytes. Shorter messages are ignored.\n"
       + "-subject <regexp> # Optional java.util.regex.Pattern regular expression\n"
       + "                  # only messages with a matching Subject line are deleted\n"
       + "-delete           # Delete messages; the default is just to list them\n"
       + "-force            # Don"t ask for confirmation before deleting\n"
       + "-debug            # Display POP3 protocol requests and responses\n");
   System.exit(1);
 }
 // Send a POP3 command to the server and return its response
 public static String send(String cmd) throws IOException {
   if (debug)
     System.out.println(">>>" + cmd);
   out.print(cmd); // Send command
   out.print("\r\n"); // and line terminator.
   out.flush(); // Send it now!
   String response = checkResponse(); // Get the response.
   if (debug)
     System.out.println("<<<+OK " + response);
   return response;
 }
 // Wait for a response and make sure it is an "OK" response.
 public static String checkResponse() throws IOException {
   String response;
   for (;;) {
     response = in.readLine();
     if (response == null)
       throw new IOException("Server unexpectedly closed connection");
     else if (response.startsWith("-ERR"))
       throw new IOException("Error from server: " + response);
     else if (response.startsWith("+OK"))
       return response.substring(3);
   }
 }
 // Ask the server to send the headers of the numbered message.
 // Look through them for the Subject header and return its content.
 public static String getSubject(int msgnum) throws IOException {
   send("TOP " + msgnum + " 0");
   String subject = null, line;
   for (;;) {
     line = in.readLine();
     if (line == null)
       throw new IOException("Unexpected EOF");
     if (line.startsWith("Subject: "))
       subject = line.substring(9);
     if (line.equals("."))
       break;
   }
   return subject;
 }
 // Disconnect nicely from the POP server.
 // This method is called for normal termination and exceptions.
 public static void shutdown() {
   try {
     if (out != null) {
       send("QUIT");
       out.close();
     }
     if (in != null)
       in.close();
     if (s != null)
       s.close();
   } catch (IOException e) {
   }
 }

}



 </source>
   
  
 
  



Demonstrate Sockets.

   <source lang="java">
     

import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; class Whois {

 public static void main(String args[]) throws Exception {
   int c;
   Socket s = new Socket("internic.net", 43);
   InputStream in = s.getInputStream();
   OutputStream out = s.getOutputStream();
   String str = "asdfasdfasdf\n";
   byte buf[] = str.getBytes();
   out.write(buf);
   while ((c = in.read()) != -1) {
     System.out.print((char) c);
   }
   s.close();
 }

}



 </source>
   
  
 
  



Download WWW Page

   <source lang="java">
  

import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.net.InetAddress; import java.net.Socket; import java.net.URL; import java.net.UnknownHostException; class Main{

 public String downloadWWWPage(URL pageURL) throws Exception {
   String host, file;
   host = pageURL.getHost();
   file = pageURL.getFile();
   InputStream pageStream = getWWWPageStream(host, file);
   if (pageStream == null) {
     return "";
   }
   DataInputStream in = new DataInputStream(pageStream);
   StringBuffer pageBuffer = new StringBuffer();
   String line;
   while ((line = in.readUTF()) != null) {
     pageBuffer.append(line);
   }
   in.close();
   return pageBuffer.toString();
 }
 public InputStream getWWWPageStream(String host, String file) throws IOException,
     UnknownHostException {
    
   InetAddress webServer = InetAddress.getByName(host);
   Socket httpPipe = new Socket(webServer, 80);
   if (httpPipe == null) {
     System.out.println("Socket to Web server creation failed.");
     return null;
   }
   InputStream inn = httpPipe.getInputStream(); // get raw streams
   OutputStream outt = httpPipe.getOutputStream();
   DataInputStream in = new DataInputStream(inn); // turn into higher-level ones
   PrintStream out = new PrintStream(outt);
   if (inn == null || outt == null) {
     System.out.println("Failed to open streams to socket.");
     return null;
   }
   out.println("GET " + file + " HTTP/1.0\n");
   String response;
   while ((response = in.readUTF()).length() > 0) {
     System.out.println(response);
   }
   return in;
 }

}


 </source>
   
  
 
  



Get email with Socket

   <source lang="java">
    

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; public class POP3Demo {

 public static void main(String[] args) throws Exception {
   int POP3Port = 110;
   Socket client = new Socket("127.0.0.1", POP3Port);
   InputStream is = client.getInputStream();
   BufferedReader sockin = new BufferedReader(new InputStreamReader(is));
   OutputStream os = client.getOutputStream();
   PrintWriter sockout = new PrintWriter(os, true);
   String cmd = "user Smith";
   sockout.println(cmd);
   String reply = sockin.readLine();
   cmd = "pass ";
   sockout.println(cmd + "popPassword");
   reply = sockin.readLine();
   cmd = "stat";
   sockout.println(cmd);
   reply = sockin.readLine();
   if (reply == null)
     return;
   cmd = "retr 1";
   sockout.println(cmd);
   if (cmd.toLowerCase().startsWith("retr") && reply.charAt(0) == "+")
     do {
       reply = sockin.readLine();
       System.out.println("S:" + reply);
       if (reply != null && reply.length() > 0)
         if (reply.charAt(0) == ".")
           break;
     } while (true);
   cmd = "quit";
   sockout.println(cmd);
   client.close();
 }

}



 </source>
   
  
 
  



Get the Date from server

   <source lang="java">
    

import java.io.InputStream; import java.net.Socket; public class Main {

 public static void main(String args[]) throws Exception{
   Socket s = new Socket(args[0], 13);
   InputStream is = s.getInputStream();
   while (true) {
     byte b[] = new byte[100];
     int i = is.read(b);
     if (i == -1)
       break;
     System.out.print(new String(b, 0, i));
   }
 }

}



 </source>
   
  
 
  



ObjectInputStream and ObjectOutputStream from Socket

   <source lang="java">
    

import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.Socket; public class LoopingSocketClient {

 public static void main(String args[]) throws Exception {
   Socket socket1;
   int portNumber = 1777;
   String str = "";
   socket1 = new Socket(InetAddress.getLocalHost(), portNumber);
   ObjectInputStream ois = new ObjectInputStream(socket1.getInputStream());
   ObjectOutputStream oos = new ObjectOutputStream(socket1.getOutputStream());
   str = "initialize";
   oos.writeObject(str);
   while ((str = (String) ois.readObject()) != null) {
     System.out.println(str);
     oos.writeObject("bye");
     if (str.equals("bye bye"))
       break;
   }
   ois.close();
   oos.close();
   socket1.close();
 }

}



 </source>
   
  
 
  



Ping a server

   <source lang="java">
    

import java.io.DataInputStream; import java.io.PrintStream; import java.net.Socket; public class Main {

 public static void main(String[] argv) throws Exception {
   Socket t = new Socket("127.0.0.1", 7);
   DataInputStream dis = new DataInputStream(t.getInputStream());
   PrintStream ps = new PrintStream(t.getOutputStream());
   ps.println("Hello");
   String str = dis.readUTF();
   if (str.equals("Hello"))
     System.out.println("Alive!");
   else
     System.out.println("Dead");
   t.close();
 }

}



 </source>
   
  
 
  



Read and write through socket

   <source lang="java">
    

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class Main {

 public static void whois(String query, String server) throws IOException {
   Socket sock = new Socket(server, 43);
   int c = 0;
   
   OutputStream os = sock.getOutputStream();
   InputStream is = sock.getInputStream();
   query += "\r\n";
   os.write(query.getBytes("iso8859_1"));
   while (c != -1) {
     c = is.read();
     if (c != -1)
       System.out.println((char) c);
   }
 }
 public static void main(String[] args) throws Exception {
   String hostname = "whois.networksolutions.ru";
   whois("query", hostname);
 }

}



 </source>
   
  
 
  



Read float number from a Socket

   <source lang="java">
    

import java.io.DataInputStream; import java.net.Socket; public class Main {

 public static void main(String[] args) throws Exception {
   Socket sock = new Socket(args[0], 1234);
   DataInputStream dis = new DataInputStream(sock.getInputStream());
   float f = dis.readFloat();
   System.out.println("PI=" + f);
   dis.close();
   sock.close();
 }

}



 </source>
   
  
 
  



Read from server

   <source lang="java">
    

import java.io.DataInputStream; import java.io.InputStream; import java.net.Socket; class SocketDemo {

 public static void main(String args[]) throws Exception {
   String server = args[0];
   int port = Integer.parseInt(args[1]);
   Socket s = new Socket(server, port);
   InputStream is = s.getInputStream();
   DataInputStream dis = new DataInputStream(is);
   System.out.println(dis.readInt());
   s.close();
 }

}



 </source>
   
  
 
  



Reading Text from a Socket

   <source lang="java">
    

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Main {

 public static void main(String[] argv) throws Exception {
   int port = 2000;
   ServerSocket srv = new ServerSocket(port);
   // Wait for connection from client.
   Socket socket = srv.accept();
   BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   String str;
   while ((str = rd.readLine()) != null) {
     System.out.println(str);
   }
   rd.close();
 }

}



 </source>
   
  
 
  



Read Object from Socket

   <source lang="java">
    

import java.io.ObjectInputStream; import java.net.Socket; import java.util.Hashtable; public class Main{

 public static void main(String[] args) throws Exception {
   Socket sock = new Socket(args[0], 1234);
   ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
   Hashtable hash = (Hashtable) ois.readObject();
   System.out.println(hash);
   ois.close();
   sock.close();
 }

}



 </source>
   
  
 
  



Redirects incoming TCP connections to other hosts/ports

   <source lang="java">
   

// $Id: Proxy.java,v 1.3.4.1 2008/01/22 10:01:16 belaban Exp $

import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.SSLSocketFactory; import java.io.*; import java.net.*; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.*; import java.util.concurrent.Executor; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;

/**

* Redirects incoming TCP connections to other hosts/ports. All redirections are defined in a file as for example
*
 * 127.0.0.1:8888=www.ibm.ru:80
 * localhost:80=pop.mail.yahoo.ru:110
 * 
* The first line forwards all requests to port 8888 on to www.ibm.ru at port 80 (it also forwards the HTTP
* response back to the sender. The second line essentially provides a POP-3 service on port 8110, using
* Yahoo"s POP service. This is neat when you"re behind a firewall and one of the few services in the outside
* world that are not blocked is port 80 (HHTP).
* Note that JDK 1.4 is required for this class. Also, concurrent.jar has to be on the classpath. Note that * you also need to include jsse.jar/jce.jar (same location as rt.jar) if you want SSL sockets.
* To create SSLServerSockets you"ll need to do the following: * Generate a certificate as follows:
*
 * keytool -genkey -keystore /home/bela/.keystore -keyalg rsa -alias bela -storepass <passwd> -keypass <passwd>
 * 
*
* Start the Proxy as follows:
*
 * java -Djavax.net.ssl.keyStore=/home/bela/.keystore -Djavax.net.ssl.keyStorePassword=<passwd>
 *      -Djavax.net.ssl.trustStore=/home/bela/.keystore -Djavax.net.ssl.trustStorePassword=<passwd>
 *      org.jgroups.util.Proxy -file /home/bela/map.properties
 * 
* Start client as follows:
*
 * java -Djavax.net.ssl.trustStore=/home/bela/.keystore -Djavax.net.ssl.trustStorePassword=<passwd> sslclient
 * 
* 
* To import a certificate into the keystore, use the following steps:
*
 * openssl x509 -in server.crt -out server.crt.der -outform DER
 * keytool -import -trustcacerts -alias <your alias name> -file server.crt.der
 * 
* This will store the server"s certificate in the ${user.home}/.keystore key store.
* 
* Note that an SSL client or server can be debugged by starting it as follows:
*
-Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol -Djavax.net.debug=ssl
* 
* If you run a web browser, simply enter https://<host>:<port> as URL to connect to an SSLServerSocket *
Note that we cannot use JDK 1.4"s selectors for SSL sockets, as * getChannel() on an SSL socket doesn"t seem to work. * @todo Check whether SSLSocket.getChannel() or SSLServerSocket.getChannel() works. * @author Bela Ban */

public class Proxy {

   InetAddress           local=null, remote=null;
   int                   local_port=0, remote_port=0;
   static boolean        verbose=false;
   static boolean        debug=false;
   String                mapping_file=null; // contains a list of src and dest host:port pairs
   final HashMap         mappings=new HashMap(); // keys=MyInetSocketAddr (src), values=MyInetSocketAddr (dest)
   Executor              executor; // maintains a thread pool
   static final int      MIN_THREAD_POOL_SIZE=2;
   static final int      MAX_THREAD_POOL_SIZE=64; // for processing requests
   static final int      BUFSIZE=1024; // size of data transfer buffer
   public Proxy(InetAddress local, int local_port, InetAddress remote, int remote_port, boolean verbose, boolean debug) {
       this.local=local;
       this.local_port=local_port;
       this.remote=remote;
       this.remote_port=remote_port;
       Proxy.verbose=verbose;
       Proxy.debug=debug;
   }
   public Proxy(InetAddress local, int local_port, InetAddress remote, int remote_port,
                   boolean verbose, boolean debug, String mapping_file) {
       this(local, local_port, remote, remote_port, verbose, debug);
       this.mapping_file=mapping_file;
   }
   public void start() throws Exception {
       Map.Entry           entry;
       Selector            selector;
       ServerSocketChannel sock_channel;
       MyInetSocketAddress key, value;
       if (remote !=null && local !=null)
           mappings.put(new InetSocketAddress(local, local_port), new InetSocketAddress(remote, remote_port));
       
       if (mapping_file !=null) {
           try {
               populateMappings(mapping_file);
           }
           catch (Exception ex) {
               log("Failed reading " + mapping_file);
               throw ex;
           }
       }
       log("\nProxy started at " + new java.util.Date());
       if (verbose) {
           log("\nMappings:\n---------");
           for (Iterator it=mappings.entrySet().iterator(); it.hasNext();) {
               entry=(Map.Entry) it.next();
               log(toString((InetSocketAddress) entry.getKey()) + " <--> "
                   + toString((InetSocketAddress) entry.getValue()));
           }
           log("\n");
       }
       // 1. Create a Selector
       selector=Selector.open();
       // Create a thread pool (Executor)
       executor=new ThreadPoolExecutor(MIN_THREAD_POOL_SIZE, MAX_THREAD_POOL_SIZE, 30000, TimeUnit.MILLISECONDS,
                                       new LinkedBlockingQueue(1000));
       for (Iterator it=mappings.keySet().iterator(); it.hasNext();) {
           key=(MyInetSocketAddress) it.next();
           value=(MyInetSocketAddress) mappings.get(key);
           // if either source or destination are SSL, we cannot use JDK 1.4
           // NIO selectors, but have to fall back on separate threads per connection
           if (key.ssl() || value.ssl()) {
               // if(2 == 2) {
               SocketAcceptor acceptor=new SocketAcceptor(key, value);
               executor.execute(acceptor);
               continue;
           }
           // 2. Create a ServerSocketChannel
           sock_channel=ServerSocketChannel.open();
           sock_channel.configureBlocking(false);
           sock_channel.socket().bind(key);
           // 3. Register the selector with all server sockets. "Key" is attachment, so we get it again on
           //    select(). That way we can associate it with the mappings hashmap to find the corresponding
           //    value
           sock_channel.register(selector, SelectionKey.OP_ACCEPT, key);
       }
       // 4. Start main loop. won"t return until CTRL-C"ed        
       loop(selector);
   }
   /** We handle only non-SSL connections */
   void loop(Selector selector) {
       Set                 ready_keys;
       SelectionKey        key;
       ServerSocketChannel srv_sock;
       SocketChannel       in_sock, out_sock;
       InetSocketAddress   src, dest;
       while (true) {
           if (verbose)
               log("[Proxy] ready to accept connection");
           // 4. Call Selector.select()
           try {
               selector.select();
               // get set of ready objects
               ready_keys=selector.selectedKeys();
               for (Iterator it=ready_keys.iterator(); it.hasNext();) {
                   key=(SelectionKey) it.next();
                   it.remove();
                   if (key.isAcceptable()) {
                       srv_sock=(ServerSocketChannel) key.channel();
                       // get server socket and attachment
                       src=(InetSocketAddress) key.attachment();
                       in_sock=srv_sock.accept(); // accept request
                       if (verbose)
                           log("Proxy.loop()", "accepted connection from " + toString(in_sock));
                       dest=(InetSocketAddress) mappings.get(src);
                       // find corresponding dest
                       if (dest == null) {
                           in_sock.close();
                           log("Proxy.loop()", "did not find a destination host for " + src);
                           continue;
                       }
                       else {
                           if (verbose)
                               log("Proxy.loop()", "relaying traffic from " + toString(src) + " to " + toString(dest));
                       }
                       // establish connection to destination host
                       try {
                           out_sock=SocketChannel.open(dest);
                           // uses thread pool (Executor) to handle request, closes socks at end
                           handleConnection(in_sock, out_sock);
                       }
                       catch (Exception ex) {
                           in_sock.close();
                           throw ex;
                       }
                   }
               }
           }
           catch (Exception ex) {
               log("Proxy.loop()", "exception: " + ex);
           }
       }
   }
   //    void handleConnection(Socket in_sock, Socket out_sock) {
   //        try {
   //            Relayer r=new Relayer(in_sock, out_sock);
   //            executor.execute(r);
   //            r=new Relayer(out_sock, in_sock);
   //            executor.execute(r);
   //        }
   //        catch (Exception ex) {
   //            log("Proxy.handleConnection()", "exception: " + ex);
   //        }
   //        finally {
   //            close(in_sock, out_sock);
   //        }
   //    }
   void handleConnection(SocketChannel in, SocketChannel out) {
       try {
           _handleConnection(in, out);
       }
       catch (Exception ex) {
           log("Proxy.handleConnection()", "exception: " + ex);
       }
   }
   
   void _handleConnection(final SocketChannel in_channel, final SocketChannel out_channel) throws Exception {
       executor.execute(new Runnable() {
               public void run() {
                   Selector sel=null;
                   SocketChannel tmp;
                   Set ready_keys;
                   SelectionKey key;
                   ByteBuffer transfer_buf=ByteBuffer.allocate(BUFSIZE);
                   try {
                       sel=Selector.open();
                       in_channel.configureBlocking(false);
                       out_channel.configureBlocking(false);
                       in_channel.register(sel, SelectionKey.OP_READ);
                       out_channel.register(sel, SelectionKey.OP_READ);
                       
                       while (sel.select() > 0) {
                           ready_keys=sel.selectedKeys();
                           for (Iterator it=ready_keys.iterator(); it.hasNext();) {
                               key=(SelectionKey) it.next();
                               it.remove(); // remove current entry (why ?)
                               tmp=(SocketChannel) key.channel();
                               if (tmp == null) {
                                   log(
                                       "Proxy._handleConnection()",
                                       "attachment is null, continuing");
                                   continue;
                               }
                               if (key.isReadable()) { // data is available to be read from tmp
                                   if (tmp == in_channel) {
                                       // read all data from in_channel and forward it to out_channel (request)
                                       if (relay(tmp, out_channel, transfer_buf) == false)
                                           return;
                                   }
                                   if (tmp == out_channel) {
                                       // read all data from out_channel and forward it 
                                       // to in_channel (response)
                                       if (relay(tmp, in_channel, transfer_buf) == false)
                                           return;
                                   }
                               }
                           }
                       }
                   }
                   catch (Exception ex) {
                       ex.printStackTrace();
                   }
                   finally {
                       close(sel, in_channel, out_channel);
                   }
               }
           });
   }
   
   void close(Selector sel, SocketChannel in_channel, SocketChannel out_channel) {
       try {
           if (sel !=null)
               sel.close();
       }
       catch (Exception ex) {
       }
       try {
           if (in_channel !=null)
               in_channel.close();
       }
       catch (Exception ex) {
       }
       try {
           if (out_channel !=null)
               out_channel.close();
       }
       catch (Exception ex) {
       }
   }
   /**
    * Read all data from from and write it to to.
    * Returns false if channel was closed
    */
   boolean relay(SocketChannel from, SocketChannel to, ByteBuffer buf) throws Exception {
       int num;
       StringBuilder sb;
       buf.clear();
       while (true) {
           num=from.read(buf);
           if (num < 0)
               return false;
           else
               if (num == 0)
                   return true;
           buf.flip();
           if (verbose) {
               log(printRelayedData(toString(from), toString(to), buf.remaining()));
           }
           if (debug) {
               sb=new StringBuilder();
               sb.append(new String(buf.array()).trim());
               sb.append("\n");
               log(sb.toString());
           }
           to.write(buf);
           buf.flip();
       }
   }
   String toString(SocketChannel ch) {
       StringBuilder sb=new StringBuilder();
       Socket sock;
       if (ch == null)
           return null;
       if ((sock=ch.socket()) == null)
           return null;
       sb.append(sock.getInetAddress().getHostName()).append(":").append(sock.getPort());
       return sb.toString();
   }
   String toString(InetSocketAddress addr) {
       StringBuilder sb;
       sb=new StringBuilder();
       if (addr == null)
           return null;
       sb.append(addr.getAddress().getHostName()).append(":").append(addr.getPort());
       if (addr instanceof MyInetSocketAddress)
           sb.append(" [ssl=").append(((MyInetSocketAddress) addr).ssl()).append("]");
       return sb.toString();
   }
   
   static String printRelayedData(String from, String to, int num_bytes) {
       StringBuilder sb;
       sb=new StringBuilder();
       sb.append("\n[PROXY] ").append(from);
       sb.append(" to ").append(to);
       sb.append(" (").append(num_bytes).append(" bytes)");
       // log("Proxy.relay()", sb.toString());
       return sb.toString();
   }
   
   /**
    * Populates mappings hashmap. An example of a definition file is:
*
     * http://localhost:8888=http://www.yahoo.ru:80
     * https://localhost:2200=https://cvs.sourceforge.net:22
     * http://localhost:8000=https://www.ibm.ru:443
     * 
    * Mappings can be http-https, https-http, http-http or https-https
    */
   void populateMappings(String filename) throws Exception {
       FileInputStream   in=new FileInputStream(filename);
       BufferedReader    reader;
       String            line;
       URI               key, value;
       int               index;
       boolean           ssl_key, ssl_value;
       final String      HTTPS="https";
       reader=new BufferedReader(new InputStreamReader(in));
       while ((line=reader.readLine()) !=null) {
           line=line.trim();
           if (line.startsWith("//") || line.startsWith("#") || line.length() == 0)
               continue;
           index=line.indexOf("=");
           if (index == -1)
               throw new Exception("Proxy.populateMappings(): detected no "=" character in " + line);
           key=new URI(line.substring(0, index));
           ssl_key=key.getScheme().trim().equals(HTTPS);
           value=new URI(line.substring(index + 1));
           ssl_value=value.getScheme().trim().equals(HTTPS);
           check(key);
           check(value);
           log("key: " + key + ", value: " + value);
           mappings.put(new MyInetSocketAddress(key.getHost(), key.getPort(), ssl_key),
                        new MyInetSocketAddress(value.getHost(), value.getPort(), ssl_value));
       }
       in.close();
   }
   /** Checks whether a URI is http(s)://<host>:<port> */
   void check(URI u) throws Exception {
       if (u.getScheme() == null)
           throw new Exception(
               "scheme is null in " + u + ", (valid URI is \"http(s)://<host>:<port>\")");
       if (u.getHost() == null)
           throw new Exception(
               "host is null in " + u + ", (valid URI is \"http(s)://<host>:<port>\")");
       if (u.getPort() <=0)
           throw new Exception(
               "port is <=0 in " + u + ", (valid URI is \"http(s)://<host>:<port>\")");
   }
   /** Input is "host:port" */
   SocketAddress strToAddr(String input) throws Exception {
       StringTokenizer tok=new StringTokenizer(input, ":");
       String host, port;
       host=tok.nextToken();
       port=tok.nextToken();
       return new InetSocketAddress(host, Integer.parseInt(port));
   }
   String printSelectionOps(SelectionKey key) {
       StringBuilder sb=new StringBuilder();
       if ((key.readyOps() & SelectionKey.OP_ACCEPT) !=0)
           sb.append("OP_ACCEPT ");
       if ((key.readyOps() & SelectionKey.OP_CONNECT) !=0)
           sb.append("OP_CONNECT ");
       if ((key.readyOps() & SelectionKey.OP_READ) !=0)
           sb.append("OP_READ ");
       if ((key.readyOps() & SelectionKey.OP_WRITE) !=0)
           sb.append("OP_WRITE ");
       return sb.toString();
   }
   public static void main(String[] args) {
       Proxy    p;
       InetAddress local=null, remote=null;
       int         local_port=0, remote_port=0;
       String      tmp, tmp_addr, tmp_port;
       boolean     verbose=false, debug=false;
       int         index;
       String      mapping_file=null;
       try {
           for (int i=0; i < args.length; i++) {
               tmp=args[i];
               if ("-help".equals(tmp)) {
                   help();
                   return;
               }
               if ("-verbose".equals(tmp)) {
                   verbose=true;
                   continue;
               }
               if ("-local".equals(tmp)) {
                   tmp_addr=args[++i];
                   index=tmp_addr.indexOf(":");
                   if (index > -1) { // it is in the format address:port
                       tmp_port=tmp_addr.substring(index + 1);
                       local_port=Integer.parseInt(tmp_port);
                       tmp_addr=tmp_addr.substring(0, index);
                       local=InetAddress.getByName(tmp_addr);
                   }
                   else
                       local=InetAddress.getByName(args[++i]);
                   continue;
               }
               if ("-local_port".equals(tmp)) {
                   local_port=Integer.parseInt(args[++i]);
                   continue;
               }
               if ("-remote".equals(tmp)) {
                   tmp_addr=args[++i];
                   index=tmp_addr.indexOf(":");
                   if (index > -1) { // it is in the format address:port
                       tmp_port=tmp_addr.substring(index + 1);
                       remote_port=Integer.parseInt(tmp_port);
                       tmp_addr=tmp_addr.substring(0, index);
                       remote=InetAddress.getByName(tmp_addr);
                   }
                   else
                       remote=InetAddress.getByName(args[++i]);
                   continue;
               }
               if ("-remote_port".equals(tmp)) {
                   remote_port=Integer.parseInt(args[++i]);
                   continue;
               }
               if ("-file".equals(tmp)) {
                   mapping_file=args[++i];
                   continue;
               }
               if ("-debug".equals(tmp)) {
                   debug=true;
                   continue;
               }
               help();
               return;
           }
           if (local == null)
               local=InetAddress.getLocalHost();
           p=new Proxy(local, local_port, remote, remote_port, verbose, debug, mapping_file);
           p.start();
       }
       catch (Throwable ex) {
           ex.printStackTrace();
       }
   }
   static void help() {
       System.out.println("Proxy [-help] [-local <local address>] [-local_port <port>] "
                          + "[-remote <remote address>] [-remote_port <port>] [-verbose] "
                          + "[-file <mapping file>] [-debug]");
   }
   static void log(String method_name, String msg) {
       System.out.println("[" + method_name + "]: " + msg);
   }
   static void log(String msg) {
       System.out.println(msg);
   }
   static void close(Socket in, Socket out) {
       if (in !=null) {
           try {
               in.close();
           }
           catch (Exception ex) {
           }
       }
       if (out !=null) {
           try {
               out.close();
           }
           catch (Exception ex) {
           }
       }
   }
   static void close(Socket sock) {
       if (sock !=null) {
           try {
               sock.close();
           }
           catch (Exception ex) {
           }
       }
   }
   static class Relayer implements Runnable {
       final Socket         in_sock;
       final Socket out_sock;
       final InputStream    in;
       final OutputStream   out;
       Thread         t=null;
       final java.util.List listeners=new ArrayList();
       String         name=null;
       interface Listener {
           void connectionClosed();
       }
       public Relayer(Socket in_sock, Socket out_sock, String name) throws Exception {
           this.in_sock=in_sock;
           this.out_sock=out_sock;
           this.name=name;
           in=in_sock.getInputStream();
           out=out_sock.getOutputStream();
       }
       public void addListener(Listener l) {
           if(l != null && !listeners.contains(l))
               listeners.add(l);
       }
       public void run() {
           byte[]       buf=new byte[1024];
           int          num;
           StringBuilder sb;
           try {
               while(t != null) {
                   if ((num=in.read(buf)) == -1)
                       break;
                   if (verbose) {
                       
                       //sb=new StringBuilder();
                       //sb.append("forwarding ").append(num).append(" bytes from ").append(toString(in_sock));
                       //sb.append(" to ").append(toString(out_sock));
                       // log("Proxy.Relayer.run()", sb.toString());
                       log(printRelayedData(toString(in_sock), toString(out_sock), num));
                   }
                   if (debug) {
                       sb=new StringBuilder();
                       sb.append(new String(buf, 0, num).trim());
                       log(sb.toString());
                   }
                   out.write(buf, 0, num);
                   //if(debug)
                   //    System.out.println(new String(buf));
               }
               
           }            
           catch (Exception ex) {
               log("Proxy.Relayer.run(): [" + name + "] exception=" + ex + ", in_sock=" +
                   in_sock + ", out_sock=" + out_sock);
           }
           finally {
               stop();
           }
       }
       public void start() {
           if(t == null) {
               t=new Thread(this, "Proxy.Relayer");
               t.setDaemon(true);
               t.start();
           }
       }
       public void stop() {
           t=null;
           close(in_sock);
           close(out_sock);
       }
       String toString(Socket s) {
           if(s == null) return null;
           return s.getInetAddress().getHostName() + ":" + s.getPort();
       }
       
       void notifyListeners() {
           for(Iterator it=listeners.iterator(); it.hasNext();) {
               try {
                   ((Listener)it.next()).connectionClosed();
               }
               catch(Throwable ex) {
                   ;
               }
           }
       }
   }
   static class MyInetSocketAddress extends InetSocketAddress {
       boolean is_ssl=false;
       public MyInetSocketAddress(InetAddress addr, int port) {
           super(addr, port);
       }
       public MyInetSocketAddress(InetAddress addr, int port, boolean is_ssl) {
           super(addr, port);
           this.is_ssl=is_ssl;
       }
       public MyInetSocketAddress(int port) {
           super(port);
       }
       public MyInetSocketAddress(int port, boolean is_ssl) {
           super(port);
           this.is_ssl=is_ssl;
       }
       public MyInetSocketAddress(String hostname, int port) {
           super(hostname, port);
       }
       public MyInetSocketAddress(String hostname, int port, boolean is_ssl) {
           super(hostname, port);
           this.is_ssl=is_ssl;
       }
       public boolean ssl() {
           return is_ssl;
       }
       public String toString() {
           return super.toString() + " [ssl: " + ssl() + "]";
       }
   }
   /**
    * Handles accepts on an SSLServerSocket or ServerSocket. Creates a {@link
    * Connection} for each successful accept().
    * 
    * @author bela Dec 19, 2002
    */
   class SocketAcceptor implements Runnable {
       ServerSocket        srv_sock=null;
       MyInetSocketAddress dest=null;
       
       /**
        * Create an SSLServerSocket or ServerSocket and continuously call
        * accept() on it.
        * @param sock_addr
        */
       public SocketAcceptor(MyInetSocketAddress sock_addr, MyInetSocketAddress dest) throws Exception {
           this.dest=dest;
           if(sock_addr.ssl()) {
               srv_sock=createSSLServerSocket(sock_addr);
           }
           else {
               srv_sock=createServerSocket(sock_addr);
           }
           executor.execute(this);
       }
       public void run() {
           Connection conn;
           Socket     s, dest_sock;
           while (srv_sock !=null) {
               try {
                   s=srv_sock.accept();
                   dest_sock=dest.ssl() ? createSSLSocket(dest) : createSocket(dest);
                   conn=new Connection(s, dest_sock);
                   conn.start();
               }
               catch (Exception e) {
                   log("Proxy.SSLServerSocketAcceptor.run(): exception=" + e);
                   break;
               }
           }
       }
       
       Socket createSocket(InetSocketAddress addr) throws Exception {
           return new Socket(addr.getAddress(), addr.getPort());
       }
       Socket createSSLSocket(InetSocketAddress addr) throws Exception {
           SSLSocketFactory sslsocketfactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
           return sslsocketfactory.createSocket(addr.getAddress(), addr.getPort());
       }
       ServerSocket createServerSocket(InetSocketAddress addr) throws Exception {
           return new ServerSocket(addr.getPort(), 10, addr.getAddress());
       }
       
       ServerSocket createSSLServerSocket(InetSocketAddress addr) throws Exception {
           SSLServerSocketFactory sslserversocketfactory =
               (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
           SSLServerSocket sslserversocket;
           sslserversocket=(SSLServerSocket)sslserversocketfactory.createServerSocket(addr.getPort(), 10, addr.getAddress());
           return sslserversocket;
       }
   }
   /**
    * Handles an incoming SSLSocket or Socket. Looks up the destination in the
    * mapping hashmap, key is the incoming socket address. Creates an outgoing
    * socket (regular or SSL, depending on settings) and relays data between
    * incoming and outgoing sockets. Closes the connection when either incoming
    * or outgoing socket is closed, or when stop() is called.
    * 
    * @author bela Dec 19, 2002
    */
   static class Connection implements Relayer.Listener {
       Relayer in_to_out=null;
       Relayer out_to_in=null;
       /**
        * Creates an outgoing (regular or SSL) socket according to the mapping
        * table. Sets both input and output stream. Caller needs to call
        * start() after the instance has been created.
        * @param in The Socket we got as result of accept()
        * @throws Exception Thrown if either the input or output streams cannot
        * be created.
        */
       public Connection(Socket in, Socket out) throws Exception {
           in_to_out=new Relayer(in, out, "in-out");
           in_to_out.addListener(this);
           out_to_in=new Relayer(out, in, "out-in");
           out_to_in.addListener(this);
       }
       /** Starts relaying between incoming and outgoing sockets.
        * Returns immediately (thread is started). 
        * 
        */
       public void start() {
           in_to_out.start();
           out_to_in.start();
       }
       public void stop() {
           if (in_to_out !=null) {
               in_to_out.stop();
           }
           if (out_to_in !=null) {
               out_to_in.stop();
           }
       }
       public void connectionClosed() {
           stop();
       }
   }

}



 </source>
   
  
 
  



Sending a POST Request Using a Socket

   <source lang="java">
    

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; import java.net.URLEncoder; public class Main {

 public static void main(String[] argv) throws Exception {
   String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
   
   Socket socket = new Socket("127.0.0.1", 8080);
   String path = "/servlet";
   BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
   wr.write("POST " + path + " HTTP/1.0\r\n");
   wr.write("Content-Length: " + data.length() + "\r\n");
   wr.write("Content-Type: application/x-www-form-urlencoded\r\n");
   wr.write("\r\n");
   wr.write(data);
   wr.flush();
   BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   String line;
   while ((line = rd.readLine()) != null) {
     System.out.println(line);
   }
   wr.close();
   rd.close();
 }

}



 </source>
   
  
 
  



ServerSocket and Socket for Serializable object

   <source lang="java">
    

import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.ServerSocket; import java.net.Socket; import java.util.Iterator; import java.util.Vector; class ComplexCompany implements Serializable {

 private String name;
 private ComplexEmployee president;
 private Vector departments;
 public ComplexCompany(String name) {
   this.name = name;
   departments = new Vector();
 }
 public String getName() {
   return this.name;
 }
 public void addDepartment(ComplexDepartment dept) {
   departments.addElement(dept);
 }
 public ComplexEmployee getPresident() {
   return this.president;
 }
 public void addPresident(ComplexEmployee e) {
   this.president = e;
 }
 public Iterator getDepartmentIterator() {
   return departments.iterator();
 }
 public void printCompanyObject() {
   System.out.println("The company name is " + getName());
   System.out.println("The company president is " + getPresident().getName());
   System.out.println(" ");
   Iterator i = getDepartmentIterator();
   while (i.hasNext()) {
     ComplexDepartment d = (ComplexDepartment) i.next();
     System.out.println("   The department name is " + d.getName());
     System.out.println("   The department manager is " + d.getManager().getName());
     System.out.println(" ");
   }
 }

} class ComplexDepartment implements Serializable {

 private String name;
 private ComplexEmployee manager;
 public ComplexDepartment(String name) {
   this.name = name;
 }
 public String getName() {
   return this.name;
 }
 public ComplexEmployee getManager() {
   return this.manager;
 }
 public void addManager(ComplexEmployee e) {
   manager = e;
 }

} class ComplexEmployee implements Serializable {

 private String name;
 private int salary;
 /** Creates a new instance of ComplexEmployee */
 public ComplexEmployee(String name, int salary) {
   this.name = name;
   this.salary = salary;
 }
 public String getName() {
   return name;
 }
 public int getSalary() {
   return this.salary;
 }

} public class ComplexSocketServer {

 public static void main(String args[]) throws Exception {
   ServerSocket servSocket;
   Socket fromClientSocket;
   int cTosPortNumber = 1777;
   String str;
   ComplexCompany comp;
   servSocket = new ServerSocket(cTosPortNumber);
   System.out.println("Waiting for a connection on " + cTosPortNumber);
   fromClientSocket = servSocket.accept();
   ObjectOutputStream oos = new ObjectOutputStream(fromClientSocket.getOutputStream());
   ObjectInputStream ois = new ObjectInputStream(fromClientSocket.getInputStream());
   while ((comp = (ComplexCompany) ois.readObject()) != null) {
     comp.printCompanyObject();
     oos.writeObject("bye bye");
     break;
   }
   oos.close();
   fromClientSocket.close();
 }

}


public class ComplexSocketClient {

 public static void main(String args[]) throws Exception {
   Socket socket1;
   int portNumber = 1777;
   String str = "";
   socket1 = new Socket(InetAddress.getLocalHost(), portNumber);
   ObjectInputStream ois = new ObjectInputStream(socket1.getInputStream());
   ObjectOutputStream oos = new ObjectOutputStream(socket1.getOutputStream());
   ComplexCompany comp = new ComplexCompany("A");
   ComplexEmployee emp0 = new ComplexEmployee("B", 1000);
   comp.addPresident(emp0);
   ComplexDepartment sales = new ComplexDepartment("C");
   ComplexEmployee emp1 = new ComplexEmployee("D", 1200);
   sales.addManager(emp1);
   comp.addDepartment(sales);
   ComplexDepartment accounting = new ComplexDepartment("E");
   ComplexEmployee emp2 = new ComplexEmployee("F", 1230);
   accounting.addManager(emp2);
   comp.addDepartment(accounting);
   ComplexDepartment maintenance = new ComplexDepartment("Maintenance");
   ComplexEmployee emp3 = new ComplexEmployee("Greg Hladlick", 1020);
   maintenance.addManager(emp3);
   comp.addDepartment(maintenance);
   oos.writeObject(comp);
   while ((str = (String) ois.readObject()) != null) {
     System.out.println(str);
     oos.writeObject("bye");
     if (str.equals("bye"))
       break;
   }
   ois.close();
   oos.close();
   socket1.close();
 }

}



 </source>
   
  
 
  



Socket Address Encoder

   <source lang="java">

/*

* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*  http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.StringTokenizer; /**

* Internal class, do not use directly.
* 
* Encodes and decodes socket addresses (IP and port) from and to the format
* used with for example the PORT and PASV command
*
* @author The Apache MINA Project (dev@mina.apache.org)
*/

public class SocketAddressEncoder {

   private static int convertAndValidateNumber(String s) {
       int i = Integer.parseInt(s);
       if (i < 0) {
           throw new IllegalArgumentException("Token can not be less than 0");
       } else if (i > 255) {
           throw new IllegalArgumentException(
                   "Token can not be larger than 255");
       }
       return i;
   }
   public static InetSocketAddress decode(String str)
           throws UnknownHostException {
       StringTokenizer st = new StringTokenizer(str, ",");
       if (st.countTokens() != 6) {
           throw new Exception("Illegal amount of tokens");
       }
       StringBuffer sb = new StringBuffer();
       try {
           sb.append(convertAndValidateNumber(st.nextToken()));
           sb.append(".");
           sb.append(convertAndValidateNumber(st.nextToken()));
           sb.append(".");
           sb.append(convertAndValidateNumber(st.nextToken()));
           sb.append(".");
           sb.append(convertAndValidateNumber(st.nextToken()));
       } catch (IllegalArgumentException e) {
           throw new Exception(e.getMessage());
       }
       InetAddress dataAddr = InetAddress.getByName(sb.toString());
       // get data server port
       int dataPort = 0;
       try {
           int hi = convertAndValidateNumber(st.nextToken());
           int lo = convertAndValidateNumber(st.nextToken());
           dataPort = (hi << 8) | lo;
       } catch (IllegalArgumentException ex) {
           throw new Exception("Invalid data port: " + str);
       }
       return new InetSocketAddress(dataAddr, dataPort);
   }
   public static String encode(InetSocketAddress address) {
       InetAddress servAddr = address.getAddress();
       int servPort = address.getPort();
       return servAddr.getHostAddress().replace(".", ",") + ","
               + (servPort >> 8) + "," + (servPort & 0xFF);
   }

}

 </source>
   
  
 
  



Socket connection and concurrent package

   <source lang="java">
    

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ExecutorHttpd {

 ExecutorService executor = Executors.newFixedThreadPool(3);
 public void start(int port) throws IOException {
   final ServerSocket ss = new ServerSocket(port);
   while (!executor.isShutdown())
     executor.submit(new TinyHttpdConnection(ss.accept()));
 }
 public void shutdown() throws InterruptedException {
   executor.shutdown();
   executor.awaitTermination(30, TimeUnit.SECONDS);
   executor.shutdownNow();
 }
 public static void main(String argv[]) throws Exception {
   new ExecutorHttpd().start(Integer.parseInt(argv[0]));
 }

} class TinyHttpdConnection implements Runnable {

 Socket client;
 TinyHttpdConnection(Socket client) throws SocketException {
   this.client = client;
 }
 public void run() {
   try {
     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream(),
         "8859_1"));
     OutputStream out = client.getOutputStream();
     PrintWriter pout = new PrintWriter(new OutputStreamWriter(out, "8859_1"), true);
     String request = in.readLine();
     System.out.println("Request: " + request);
     byte[] data = "hello".getBytes();
     out.write(data, 0, data.length);
     out.flush();
     client.close();
   } catch (IOException e) {
     System.out.println("I/O error " + e);
   }
 }

}



 </source>
   
  
 
  



Socket Fetcher

   <source lang="java">

/*

* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License").  You
* may not use this file except in compliance with the License. You can obtain
* a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
* or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
* Sun designates this particular file as subject to the "Classpath" exception
* as provided by Sun in the GPL Version 2 section of the License file that
* accompanied this code.  If applicable, add the following below the License
* Header, with the fields enclosed by brackets [] replaced by your own
* identifying information: "Portions Copyrighted [year]
* [name of copyright owner]"
*
* Contributor(s):
*
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license."  If you don"t indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above.  However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/

/*

* @(#)SocketFetcher.java 1.20 07/05/04
*/

import java.security.*; import java.net.*; import java.io.*; import java.lang.reflect.*; import java.util.*; import javax.net.*; import javax.net.ssl.*; /**

* This class is used to get Sockets. Depending on the arguments passed
* it will either return a plain java.net.Socket or dynamically load
* the SocketFactory class specified in the classname param and return
* a socket created by that SocketFactory.
*
* @author Max Spivak
* @author Bill Shannon
*/

public class SocketFetcher {

   // No one should instantiate this class.
   private SocketFetcher() {
   }
   /**
    * This method returns a Socket.  Properties control the use of
    * socket factories and other socket characteristics.  The properties
* used are:

*

    *
  • prefix.socketFactory.class *
  • prefix.socketFactory.fallback *
  • prefix.socketFactory.port *
  • prefix.timeout *
  • prefix.connectiontimeout *
  • prefix.localaddress *
  • prefix.localport *
<p>
    * If the socketFactory.class property isn"t set, the socket
    * returned is an instance of java.net.Socket connected to the
    * given host and port. If the socketFactory.class property is set,
    * it is expected to contain a fully qualified classname of a
    * javax.net.SocketFactory subclass.  In this case, the class is
    * dynamically instantiated and a socket created by that
    * SocketFactory is returned. <p>
    *
    * If the socketFactory.fallback property is set to false, don"t
    * fall back to using regular sockets if the socket factory fails. <p>
    *
    * The socketFactory.port specifies a port to use when connecting
    * through the socket factory.  If unset, the port argument will be
    * used.  <p>
    *
    * If the connectiontimeout property is set, we use a separate thread
    * to make the connection so that we can timeout that connection attempt.
    * <p>
    *
    * If the timeout property is set, it is used to set the socket timeout.
    * <p>
    *
    * If the localaddress property is set, it"s used as the local address
    * to bind to.  If the localport property is also set, it"s used as the
    * local port number to bind to.
    *
    * @param host The host to connect to
    * @param port The port to connect to at the host
    * @param props Properties object containing socket properties
    * @param prefix Property name prefix, e.g., "mail.imap"
    * @param useSSL use the SSL socket factory as the default
    */
   public static Socket getSocket(String host, int port, Properties props,
       String prefix, boolean useSSL)
       throws IOException {
 if (prefix == null)
     prefix = "socket";
 if (props == null)
     props = new Properties(); // empty
 String s = props.getProperty(prefix + ".connectiontimeout", null);
 int cto = -1;
 if (s != null) {
     try {
   cto = Integer.parseInt(s);
     } catch (NumberFormatException nfex) { }
 }
 Socket socket = null;
 String timeout = props.getProperty(prefix + ".timeout", null);
 String localaddrstr = props.getProperty(prefix + ".localaddress", null);
 InetAddress localaddr = null;
 if (localaddrstr != null)
     localaddr = InetAddress.getByName(localaddrstr);
 String localportstr = props.getProperty(prefix + ".localport", null);
 int localport = 0;
 if (localportstr != null) {
     try {
   localport = Integer.parseInt(localportstr);
     } catch (NumberFormatException nfex) { }
 }
 boolean fb = false;
 String fallback =
     props.getProperty(prefix + ".socketFactory.fallback", null);
 fb = fallback == null || (!fallback.equalsIgnoreCase("false"));
 String sfClass =
     props.getProperty(prefix + ".socketFactory.class", null);
 int sfPort = -1;
 try {
     SocketFactory sf = getSocketFactory(sfClass);
     if (sf != null) {
   String sfPortStr =
       props.getProperty(prefix + ".socketFactory.port", null);
   if (sfPortStr != null) {
       try {
     sfPort = Integer.parseInt(sfPortStr);
       } catch (NumberFormatException nfex) { }
   }
   // if port passed in via property isn"t valid, use param
   if (sfPort == -1)
       sfPort = port;
   socket = createSocket(localaddr, localport,
           host, sfPort, cto, sf, useSSL);
     }
 } catch (SocketTimeoutException sex) {
     throw sex;
 } catch (Exception ex) {
     if (!fb) {
   if (ex instanceof InvocationTargetException) {
       Throwable t =
         ((InvocationTargetException)ex).getTargetException();
       if (t instanceof Exception)
     ex = (Exception)t;
   }
   if (ex instanceof IOException)
       throw (IOException)ex;
   IOException ioex = new IOException(
           "Couldn"t connect using \"" + sfClass + 
           "\" socket factory to host, port: " +
           host + ", " + sfPort +
           "; Exception: " + ex);
   ioex.initCause(ex);
   throw ioex;
     }
 }
 if (socket == null)
     socket = createSocket(localaddr, localport,
       host, port, cto, null, useSSL);
 int to = -1;
 if (timeout != null) {
     try {
   to = Integer.parseInt(timeout);
     } catch (NumberFormatException nfex) { }
 }
 if (to >= 0)
     socket.setSoTimeout(to);
 configureSSLSocket(socket, props, prefix);
 return socket;
   }
   public static Socket getSocket(String host, int port, Properties props,
       String prefix) throws IOException {
 return getSocket(host, port, props, prefix, false);
   }
   /**
    * Create a socket with the given local address and connected to
    * the given host and port.  Use the specified connection timeout.
    * If a socket factory is specified, use it.  Otherwise, use the
    * SSLSocketFactory if useSSL is true.
    */
   private static Socket createSocket(InetAddress localaddr, int localport,
       String host, int port, int cto,
       SocketFactory sf, boolean useSSL)
       throws IOException {
 Socket socket;
 if (sf != null)
     socket = sf.createSocket();
 else if (useSSL)
     socket = SSLSocketFactory.getDefault().createSocket();
 else
     socket = new Socket();
 if (localaddr != null)
     socket.bind(new InetSocketAddress(localaddr, localport));
 if (cto >= 0)
     socket.connect(new InetSocketAddress(host, port), cto);
 else
     socket.connect(new InetSocketAddress(host, port));
 return socket;
   }
   /**
    * Return a socket factory of the specified class.
    */
   private static SocketFactory getSocketFactory(String sfClass)
       throws ClassNotFoundException,
           NoSuchMethodException,
           IllegalAccessException,
           InvocationTargetException {
 if (sfClass == null || sfClass.length() == 0)
     return null;
 // dynamically load the class 
 ClassLoader cl = getContextClassLoader();
 Class clsSockFact = null;
 if (cl != null) {
     try {
   clsSockFact = cl.loadClass(sfClass);
     } catch (ClassNotFoundException cex) { }
 }
 if (clsSockFact == null)
     clsSockFact = Class.forName(sfClass);
 // get & invoke the getDefault() method
 Method mthGetDefault = clsSockFact.getMethod("getDefault", 
                new Class[]{});
 SocketFactory sf = (SocketFactory)
     mthGetDefault.invoke(new Object(), new Object[]{});
 return sf;
   }
   /**
    * Start TLS on an existing socket.
    * Supports the "STARTTLS" command in many protocols.
    * This version for compatibility possible third party code
    * that might"ve used this API even though it shouldn"t.
    */
   public static Socket startTLS(Socket socket) throws IOException {
 return startTLS(socket, new Properties(), "socket");
   }
   /**
    * Start TLS on an existing socket.
    * Supports the "STARTTLS" command in many protocols.
    */
   public static Socket startTLS(Socket socket, Properties props,
       String prefix) throws IOException {
 InetAddress a = socket.getInetAddress();
 String host = a.getHostName();
 int port = socket.getPort();

//System.out.println("SocketFetcher: startTLS host " + host + ", port " + port);

 try {
     SSLSocketFactory ssf;
     String sfClass =
   props.getProperty(prefix + ".socketFactory.class", null);
     SocketFactory sf = getSocketFactory(sfClass);
     if (sf != null && sf instanceof SSLSocketFactory)
   ssf = (SSLSocketFactory)sf;
     else
   ssf = (SSLSocketFactory)SSLSocketFactory.getDefault();
     socket = ssf.createSocket(socket, host, port, true);
     configureSSLSocket(socket, props, prefix);
 } catch (Exception ex) {
     if (ex instanceof InvocationTargetException) {
   Throwable t =
     ((InvocationTargetException)ex).getTargetException();
   if (t instanceof Exception)
       ex = (Exception)t;
     }
     if (ex instanceof IOException)
   throw (IOException)ex;
     // wrap anything else before sending it on
     IOException ioex = new IOException("Exception in startTLS: host " +
       host + ", port " + port + "; Exception: " + ex);
     ioex.initCause(ex);
     throw ioex;
 }
 return socket;
   }
   /**
    * Configure the SSL options for the socket (if it"s an SSL socket),
    * based on the mail.<protocol>.ssl.protocols and
    * mail.<protocol>.ssl.ciphersuites properties.
    */
   private static void configureSSLSocket(Socket socket, Properties props,
       String prefix) {
 if (!(socket instanceof SSLSocket))
     return;
 SSLSocket sslsocket = (SSLSocket)socket;
 String protocols = props.getProperty(prefix + ".ssl.protocols", null);
 if (protocols != null)
     sslsocket.setEnabledProtocols(stringArray(protocols));
 else {
     /*
      * At least the UW IMAP server insists on only the TLSv1
      * protocol for STARTTLS, and won"t accept the old SSLv2
      * or SSLv3 protocols.  Here we enable only the TLSv1
      * protocol.  XXX - this should probably be parameterized.
      */
     sslsocket.setEnabledProtocols(new String[] {"TLSv1"});
 }
 String ciphers = props.getProperty(prefix + ".ssl.ciphersuites", null);
 if (ciphers != null)
     sslsocket.setEnabledCipherSuites(stringArray(ciphers));
 /*
 System.out.println("SSL protocols after " +
     Arrays.asList(sslsocket.getEnabledProtocols()));
 System.out.println("SSL ciphers after " +
     Arrays.asList(sslsocket.getEnabledCipherSuites()));
 */
   }
   /**
    * Parse a string into whitespace separated tokens
    * and return the tokens in an array.
    */
   private static String[] stringArray(String s) {
 StringTokenizer st = new StringTokenizer(s);
 List tokens = new ArrayList();
 while (st.hasMoreTokens())
     tokens.add(st.nextToken());
 return (String[])tokens.toArray(new String[tokens.size()]);
   }
   /**
    * Convenience method to get our context class loader.
    * Assert any privileges we might have and then call the
    * Thread.getContextClassLoader method.
    */
   private static ClassLoader getContextClassLoader() {
 return (ClassLoader)
   AccessController.doPrivileged(new PrivilegedAction() {
     public Object run() {
   ClassLoader cl = null;
   try {
       cl = Thread.currentThread().getContextClassLoader();
   } catch (SecurityException ex) { }
   return cl;
     }
 });
   }

}

 </source>
   
  
 
  



String based communication between Socket

   <source lang="java">
    

import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; public class BufferedSocketClient {

 public static void main(String args[]) throws Exception {
   Socket socket1;
   int portNumber = 1777;
   String str = "initialize";
   socket1 = new Socket(InetAddress.getLocalHost(), portNumber);
   BufferedReader br = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
   PrintWriter pw = new PrintWriter(socket1.getOutputStream(), true);
   pw.println(str);
   while ((str = br.readLine()) != null) {
     System.out.println(str);
     pw.println("bye");
     if (str.equals("bye"))
       break;
   }
   br.close();
   pw.close();
   socket1.close();
 }

}

///

import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class BufferedSocketServer {

 public static void main(String args[]) throws Exception {
   int cTosPortNumber = 1777;
   String str;
   ServerSocket servSocket = new ServerSocket(cTosPortNumber);
   System.out.println("Waiting for a connection on " + cTosPortNumber);
   Socket fromClientSocket = servSocket.accept();
   PrintWriter pw = new PrintWriter(fromClientSocket.getOutputStream(), true);
   BufferedReader br = new BufferedReader(new InputStreamReader(fromClientSocket.getInputStream()));
   while ((str = br.readLine()) != null) {
     System.out.println("The message: " + str);
     if (str.equals("bye")) {
       pw.println("bye");
       break;
     } else {
       str = "Server returns " + str;
       pw.println(str);
     }
   }
   pw.close();
   br.close();
   fromClientSocket.close();
 }

}



 </source>
   
  
 
  



Transfer a file via Socket

   <source lang="java">
    

import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Main {

 public static void main(String[] args) throws IOException {
   ServerSocket servsock = new ServerSocket(123456);
   File myFile = new File("s.pdf");
   while (true) {
     Socket sock = servsock.accept();
     byte[] mybytearray = new byte[(int) myFile.length()];
     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
     bis.read(mybytearray, 0, mybytearray.length);
     OutputStream os = sock.getOutputStream();
     os.write(mybytearray, 0, mybytearray.length);
     os.flush();
     sock.close();
   }
 }

} The client module import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.net.Socket; public class Main {

 public static void main(String[] argv) throws Exception {
   Socket sock = new Socket("127.0.0.1", 123456);
   byte[] mybytearray = new byte[1024];
   InputStream is = sock.getInputStream();
   FileOutputStream fos = new FileOutputStream("s.pdf");
   BufferedOutputStream bos = new BufferedOutputStream(fos);
   int bytesRead = is.read(mybytearray, 0, mybytearray.length);
   bos.write(mybytearray, 0, bytesRead);
   bos.close();
   sock.close();
 }

}



 </source>
   
  
 
  



Use Socket to read and write stream

   <source lang="java">
    

import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; class SquareClient {

 private final static int BUFSIZE = 20;
 public static void main(String args[]) throws Exception {
   String server = args[0];
   int port = Integer.parseInt(args[1]);
   double value = Double.valueOf(args[2]).doubleValue();
   Socket s = new Socket(server, port);
   OutputStream os = s.getOutputStream();
   DataOutputStream dos = new DataOutputStream(os);
   dos.writeDouble(value);
   InputStream is = s.getInputStream();
   DataInputStream dis = new DataInputStream(is);
   value = dis.readDouble();
   System.out.println(value);
   s.close();
 }

}



 </source>
   
  
 
  



Write Double Using Sockets

   <source lang="java">
  

// WriteDoubleUsingSockets - Client side that writes some objects to a stream // // Copyright (C) 1996 by Rinaldo Di Giorgio <rinaldo@digiorgio.ru>. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. import java.applet.Applet; import java.awt.Label; import java.io.DataOutputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.Date; /**

* Write some objects over the network to a remote server that reads the stream
* and procceds to save the objects to disk.
*/

public class WriteDoubleUsingSockets extends Applet {

 DataOutputStream os = null;
 ObjectOutput s = null;
 int PortNumber = 2000;
 String ServerName = "traveler";
 /**
  * Set the server and port name
  */
 public void initMain(String s, int p) {
   ServerName = s;
   PortNumber = p;
   init();
 }
 public void init() {
   Date d = new Date();
   // Get the portnumber and servername and allow to be called from a
   // java main program also
   try {
     String param;
     param = getParameter("PortNumber");
     if (param != null)
       PortNumber = Integer.parseInt(param);
     param = getParameter("ServerName");
     if (param != null)
       ServerName = param;
   } catch (NullPointerException e) { // Must be called from a main ignore
   }
   try {
     Socket skt = new Socket(ServerName, PortNumber);
     os = new DataOutputStream(skt.getOutputStream());
   } catch (Exception e) {
     Label l = new Label(e.toString());
     add(l);
     System.out.println(e);
     return;
   }
   try {
     s = new ObjectOutputStream(os);
   } catch (Exception e) {
     System.out.println(e);
     System.out.println("Unable to open stream as an object stream");
   }
   try {
     long startTime = System.currentTimeMillis();
     for (int i = 0; i < 25; i++) {
       s.writeObject(new Double(i));
     }
     os.close();
     long endTime = System.currentTimeMillis() - startTime;
     Label l = new Label("Writing 25 doubles server took: " + new Long(endTime).toString()
         + " milliseconds.");
     add(l);
     System.out.println("Object written");
   } catch (Exception e) {
     System.out.println(e);
     System.out.println("Unable to write Objects");
   }
 }
 // //////////////////////////////////////////////////////////////////////////
 // Example of an applet and a main sharing code and be parameter
 // driven.
 // //////////////////////////////////////////////////////////////////////////
 public static void main(String args[]) {
   WriteDoubleUsingSockets showSavingAClassNet = new WriteDoubleUsingSockets();
   if (args.length < 2) {
     System.out.println("Usage: ServerName PortNumber");
     System.exit(0);
   } else {
     String ServerName = new String(args[0]); // Notice local scope of
                                               // ServerName and PortNumber
     int PortNumber = Integer.parseInt(args[1]);
     showSavingAClassNet.initMain(ServerName, PortNumber);
   }
 }

}


 </source>
   
  
 
  



Write Objects From Socket

   <source lang="java">
  

// WriteObjectsFromSocket - Read Objects from a Socket and save them // // Copyright (C) 1996 by Rinaldo Di Giorgio <rinaldo@digiorgio.ru>. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. /*

*  Accept a connection and read some serialized
*  data until the stream is closed. Once it is closed
*  write the data to a disk file.
*  This program always writes to /tmp/Object.
*/

import java.io.DataInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /**

*/

class WriteObjectsFromSocket {

 public static void main(String args[]) {
   Socket rs;
   ServerSocket s;
   int PortNumber = 2000; // Fixed port
   boolean acceptLoop = true;
   ReaderWriter readerwriter = null;
   System.out.println("WriteFileFromSocket Running");
   // ////////////////////////////////////////////////////////////////
   // Open a socket on this server and listen for a connection
   // Look for data if we get here that is requests
   // ////////////////////////////////////////////////////////////////
   try {
     System.out.println("Waiting to accept connection");
     s = new ServerSocket(PortNumber);
   } catch (Exception e) {
     System.out.println("Unable to open port" + PortNumber);
     return;
   }
   while (acceptLoop) {
     try {
       rs = s.accept(); // Accept connections
     } catch (Exception e) {
       System.out.println("Accept failed port" + PortNumber);
       return;
     }
     readerwriter = new ReaderWriter(rs); // Start a thread to read the input
   }
 }

} /**

* Manage the writing of the file being read from a client
*/

class ReaderWriter extends Thread {

 byte b[] = null;
 int inputByte = 0;
 String directory = null;
 String filename = null;
 DataInputStream is;
 FileOutputStream localFile = null;
 boolean writeloop = true;
 ReaderWriter(Socket rs) {
   // /////////////////////////////////////////////
   // Open a remote stream to the client
   // /////////////////////////////////////////////
   try {
     is = new DataInputStream(rs.getInputStream());
   } catch (Exception e) {
     System.out.println("Unable to get Stream");
     return;
   }
   // /////////////////////////////////////////////
   // Open the file that is to be written to
   // /////////////////////////////////////////////
   try {
     File theFile = new File("/tmp", "Objects");
     System.out.println("The file to be created or overwritten: " + theFile);
     localFile = new FileOutputStream(theFile);
   } catch (IOException e) {
     System.out.println("Open error " + e);
     return;
   }
   // ///////////////////////////////////////////
   // Look for all the double data constantly
   // ///////////////////////////////////////////
   while (writeloop) {
     // Look for data if we get here that is requests
     try {
       inputByte = is.readByte(); // Not the best way to do it
       // Consider looking for available bytes
       // and reading that amount.
     } catch (IOException e) {
       System.out.println("In the read loop:" + e);
       writeloop = false;
     }
     // ///////////////////////////
     // We did get something
     // Write The Data
     // ///////////////////////////
     try {
       localFile.write(inputByte);
     } catch (IOException e) {
       System.out.println("Write failed");
       writeloop = false;
     }
   }
   // ////////////////////////////////
   // Close the connection and file
   // ////////////////////////////////
   try {
     rs.close();
     is.close();
     localFile.close();
   } catch (Exception e) {
     System.out.println("Unable to close ");
   }
   System.out.println("Thread exiting");
 }

}


 </source>
   
  
 
  



Writing Text to a Socket

   <source lang="java">
    

import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class Main {

 public static void main(String[] argv) throws Exception {
   int port = 2000;
   ServerSocket srv = new ServerSocket(port);
   // Wait for connection from client.
   Socket socket = srv.accept();
   BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
   wr.write("aString");
   wr.flush();
 }

}



 </source>
   
  
 
  



XML based message

   <source lang="java">
    

import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; public class SimpleSocketServer {

 public static void main(String args[]) throws Exception {
   ServerSocket serverSocket;
   int portNumber = 1777;
   Socket socket;
   String str;
   str = " <?xml version=\"1.0\" encoding=\"UTF-8\"?>";
   str += "<ticketRequest><customer custID=\"1\">";
   str += "</ticketRequest>";
   serverSocket = new ServerSocket(portNumber);
   System.out.println("Waiting for a connection on " + portNumber);
   socket = serverSocket.accept();
   ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
   oos.writeObject(str);
   oos.close();
   socket.close();
 }

}


import java.io.ObjectInputStream; import java.net.InetAddress; import java.net.Socket; public class SimpleSocketClient {

 public static void main(String args[]) throws Exception {
   Socket socket;
   int portNumber = 1777;
   String str = "";
   socket = new Socket(InetAddress.getLocalHost(), portNumber);
   ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
   str = (String) ois.readObject();
   System.out.println(str);
 }

}



 </source>
   
  
 
  



Zip socket

   <source lang="java">

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import java.net.Socket;

class ZipSocket extends Socket {

   private InputStream in;
   private OutputStream out;
   public ZipSocket() { super(); }
   public ZipSocket(String host, int port) 
       throws IOException {
       super(host, port);
   }
   public InputStream getInputStream() 
       throws IOException {
       if (in == null) {
           in = new ZipInputStream(super.getInputStream());
       }
       return in;
   }
   public OutputStream getOutputStream() 
       throws IOException {
       if (out == null) {
           out = new ZipOutputStream(super.getOutputStream());
       }
       return out;
   }
  
   public synchronized void close() throws IOException {
       OutputStream o = getOutputStream();
       o.flush();
 super.close();
   }

}

 </source>