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.
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( )); } } }); }
18.188.57.172