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 Section 15.2). 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 will need error handling. Example 17-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 17-1 shows the screen display.

Example 17-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(  )); 
            } 
        } 
    }); 
}
SocketApplet in action

Figure 17-1. SocketApplet in action

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.188.57.172