分类: Java
2006-03-11 22:29:13
Can use these classes to (a) communicate with any server, (b) construct your own server.import java.net.*;
.getByName(hostname)
From Graba:
import java.net.*; import java.io.*; public class ip { public static void main ( String[] args ) throws IOException { String hostname; BufferedReader input = new BufferedReader ( new InputStreamReader(System.in) ); System.out.print("\n"); System.out.print("Host name: "); hostname = input.readLine(); try { InetAddress ipaddress = InetAddress.getByName(hostname); System.out.println("IP address: " + ipaddress.getHostAddress()); } catch ( UnknownHostException e ) { System.out.println("Could not find IP address for: " + hostname); } } } |
Run it:
$ javac ip.java $ java ip Host name: ftp.computing.dcu.ie IP address: 136.206.11.240 |
Q. Write program to find text given numeric.
See DNS lookup.
Q. Write program to do this.
See also DOS command "ipconfig"
Not to be confused with:
Does this by trying to open a socket to that port.
import java.net.*; import java.io.*; public class ports { public static void main ( String[] args ) throws IOException { String hostname; BufferedReader input = new BufferedReader ( new InputStreamReader(System.in) ); Socket s = null; System.out.print("\n"); System.out.print("Host name: "); hostname = input.readLine(); try { // this is to see if host exists: InetAddress ipaddress = InetAddress.getByName(hostname); // int p = 21; // ftp // int p = 23; // telnet // int p = 25; // smtp int p = 80; // http // int p = 110; // pop3 try { s = new Socket(hostname, p); System.out.println("A server is running on port " + p + "."); s.close(); } catch (IOException e) { System.out.println("No server on port " + p + "."); } } catch ( UnknownHostException e ) { System.out.println("Could not find host: " + hostname); } if (s != null) { try { s.close(); } catch ( IOException ioEx ) { } } } } |
Can now look for http servers:
Host name: www.dcu.ie A server is running on port 80. Host name: dgrayweb.computing.dcu.ie A server is running on port 80. Host name: mailhost.computing.dcu.ie A server is running on port 80. Host name: merapeak.computing.dcu.ie No server on port 80. |
telnet servers (this is results from outside DCU):
Host name: camac.dcu.ie A server is running on port 23. Host name: makalu.computing.dcu.ie A server is running on port 23. Host name: eiger.computing.dcu.ie No server on port 23. Host name: www.dcu.ie No server on port 23. |
POP3 servers:
Host name: mailhost.computing.dcu.ie A server is running on port 110. |
Caution when scanning ports: Some sites don't like this.
Scanning lots of ports looks like hostile intent.
If firewall blocks a port, program will wait until timeout - could take a while.
From :
Example here is getting my latest password for how to email me:
// download text content of URL import java.net.*; import java.io.*; public class jget { public static void main ( String[] args ) throws IOException { try { URL url = new URL("http://computing.dcu.ie/~humphrys/howtomailme.html"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { System.out.println(str); } in.close(); } catch (MalformedURLException e) {} catch (IOException e) {} } } |
Q. Make URL .
Q. Download to .
Q. Parse HTML to extract password.
// get the HTTP headers import java.net.*; import java.io.*; public class jhttp { public static void main ( String[] args ) throws IOException { try { URL url = new URL("http://computing.dcu.ie/~humphrys/howtomailme.html"); URLConnection c = url.openConnection(); for (int i=0; ; i++) { String name = c.getHeaderFieldKey(i); String value = c.getHeaderField(i); if (name == null && value == null) // end of headers { break; } if (name == null) // first line of headers { System.out.println("Server HTTP version, Response code:"); System.out.println(value); System.out.print("\n"); } else { System.out.println(name + "=" + value); } } } catch (Exception e) {} } } |
Output:
Server HTTP version, Response code: HTTP/1.1 200 OK Date=Mon, 22 Nov 2004 11:43:09 GMT Server=Apache/2.0.47 (Unix) PHP/5.0.2 Last-Modified=Thu, 18 Nov 2004 10:32:20 GMT ETag="19495e-3cd-e7abf500" Accept-Ranges=bytes Content-Length=973 Keep-Alive=timeout=15, max=100 Connection=Keep-Alive Content-Type=text/html; charset=ISO-8859-1 |
http://computing.dcu.ie/BADPAGE will give something like:
Server HTTP version, Response code: HTTP/1.1 404 Not Found Date=Mon, 22 Nov 2004 12:15:27 GMT Server=Apache/2.0.47 (Unix) PHP/5.0.2 Content-Length=318 Keep-Alive=timeout=15, max=100 Connection=Keep-Alive Content-Type=text/html; charset=iso-8859-1 |
Q. Write a program to check if a URL exists and return yes/no.
http://computing.dcu.ie/~humphrys/BADPAGE will give something like:
Server HTTP version, Response code: HTTP/1.1 200 Date=Mon, 22 Nov 2004 12:12:20 GMT Server=Apache/2.0.47 (Unix) PHP/5.0.2 Keep-Alive=timeout=15, max=100 Connection=Keep-Alive Transfer-Encoding=chunked Content-Type=text/html; charset=ISO-8859-1 content-length=1270 |
Here is opening a socket directly to send a HTTP GET command and read the results:
// HTTP GET through socket, not through "URL" class import java.net.*; import java.io.*; public class sget { public static void main ( String[] args ) throws IOException { Socket s = null; try { String host = "computing.dcu.ie"; String file = "/~humphrys/howtomailme.html"; int port = 80; s = new Socket(host, port); OutputStream out = s.getOutputStream(); PrintWriter outw = new PrintWriter(out, false); outw.print("GET " + file + " HTTP/1.0\r\n"); outw.print("Accept: text/plain, text/html, text/*\r\n"); outw.print("\r\n"); outw.flush(); InputStream in = s.getInputStream(); InputStreamReader inr = new InputStreamReader(in); BufferedReader br = new BufferedReader(inr); String line; while ((line = br.readLine()) != null) { System.out.println(line); } // br.close(); // Q. Do I need this? } catch (UnknownHostException e) {} catch (IOException e) {} if (s != null) { try { s.close(); } catch ( IOException ioEx ) {} } } } |
From:
flush() - send this now.
TCP sends a variable number of bytes. It may buffer bytes (to collect a larger amount) before sending.
flush() tells it to send what it has now.
Output:
$ java sget HTTP/1.1 200 OK Date: Mon, 22 Nov 2004 15:14:10 GMT Server: Apache/2.0.47 (Unix) PHP/5.0.2 Last-Modified: Thu, 18 Nov 2004 10:32:20 GMT ETag: "19495e-3cd-e7abf500" Accept-Ranges: bytes Content-Length: 973 Connection: close Content-Type: text/html; charset=ISO-8859-1 (the URL content) |
$ telnet www.computing.dcu.ie 80 GET /index.html HTTP/1.1 Host: www.computing.dcu.ie |
(blank line to end header)
You can study the commands of any other service and write a client for that too.
Use a socket to connect to the port and then send the appropriate commands.