Recipe 18.3 Contacting a Server on the Applet Host


Problem

You want an applet to contact a socket-based server on the host from which it was loaded.

Solution

Use the method getCodeBase( ) to retrieve a URL for the applet host, and call the URL's getHost( ). Use this to construct a client socket.

Discussion

For very good security reasons, applets are not permitted network access to servers on hosts other than the one from which the applet was loaded.

To reach a server on the download host, call the applet method getCodeBase( ), which yields a URL for the applet host. Call this URL's getHost( ) method to get the hostname. Finally, use the hostname to open a client socket (see Recipe 16.1). For example:

URL u = getCodeBase( );  String host = u.getHost( );  Socket s = new Socket(host , MY_SERVER_PORT);

Of course, in real code you wouldn't create all those temporary variables:

Socket s = new Socket(getCodeBase( ).getHost( ), MY_SERVER_PORT);

And, of course, you need error handling. Example 18-2 shows an applet that constructs a sort of login dialog and passes the results to a socket-based server on the applet host using exactly this technique. Figure 18-1 shows the screen display.

Example 18-2. SocketApplet.java
/** Initialize the GUI nicely. */  public void init( ) {      Label aLabel;        setLayout(new GridBagLayout( ));      int LOGO_COL = 1;      int LABEL_COL = 2;      int TEXT_COL = 3;      int BUTTON_COL = 1;      GridBagConstraints gbc = new GridBagConstraints( );      gbc.weightx = 100.0; gbc.weighty = 100.0;        gbc.gridx = LABEL_COL; gbc.gridy = 0;       gbc.anchor = GridBagConstraints.EAST;      add(aLabel = new Label("Name:", Label.CENTER), gbc);      gbc.anchor = GridBagConstraints.CENTER;      gbc.gridx = TEXT_COL; gbc.gridy = 0;      add(nameTF=new TextField(10), gbc);        gbc.gridx = LABEL_COL; gbc.gridy = 1;      gbc.anchor = GridBagConstraints.EAST;      add(aLabel = new Label("Password:", Label.CENTER), gbc);      gbc.anchor = GridBagConstraints.CENTER;      gbc.gridx = TEXT_COL; gbc.gridy = 1;      add(passTF=new TextField(10), gbc);      passTF.setEchoChar('*');        gbc.gridx = LABEL_COL; gbc.gridy = 2;      gbc.anchor = GridBagConstraints.EAST;      add(aLabel = new Label("Domain:", Label.CENTER), gbc);      gbc.anchor = GridBagConstraints.CENTER;      gbc.gridx = TEXT_COL; gbc.gridy = 2;      add(domainTF=new TextField(10), gbc);      sendButton = new Button("Send data");      gbc.gridx = BUTTON_COL; gbc.gridy = 3;      gbc.gridwidth = 3;      add(sendButton, gbc);        whence = getCodeBase( );        // Now the action begins...      sendButton.addActionListener(new ActionListener( ) {          public void actionPerformed(ActionEvent evt) {              String name = nameTF.getText( );              if (name.length( ) == 0) {                  showStatus("Name required");                  return;              }              String domain = domainTF.getText( );              if (domain.length( ) == 0) {                  showStatus("Domain required");                  return;              }              showStatus("Connecting to host " + whence.getHost( ) +                  " as " + nameTF.getText( ));                try {                  Socket s = new Socket(getCodeBase( ).getHost( ),                       SocketServer.PORT);                  PrintWriter pf = new PrintWriter(s.getOutputStream( ), true);                  // send login name                  pf.println(nameTF.getText( ));                  // passwd                  pf.println(passTF.getText( ));                  // and domain                  pf.println(domainTF.getText( ));                    BufferedReader is = new BufferedReader(                      new InputStreamReader(s.getInputStream( )));                  String response = is.readLine( );                  showStatus(response);              } catch (IOException e) {                  showStatus("ERROR: " + e.getMessage( ));              }          }      });  }

Figure 18-1. SocketApplet in action
figs/jcb2_1801.gif




Java Cookbook
Java Cookbook, Second Edition
ISBN: 0596007019
EAN: 2147483647
Year: 2003
Pages: 409
Authors: Ian F Darwin

Similar book on Amazon

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net