ProblemYou want an applet to contact a socket-based server on the host from which it was loaded. SolutionUse the method getCodeBase( ) to retrieve a URL for the applet host, and call the URL's getHost( ). Use this to construct a client socket. DiscussionFor 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 |