Nätverksprogrammering Hugo Quisbert 20130226 1 Nätverk 2 1
Nätverk Definition: TCP (Transport Control Protocol) is a connection-based protocol that provides a reliable flow of data between two computers. Definition: UDP (User Datagram Protocol) is a protocol that sends independent packets of data, called datagrams, from one computer to another with no guarantees about arrival. UDP is not connection-based like TCP. 3 Java - Nätverksprogrammering nätverk är Javas själ nätverksbaserade applikationer java.net klasser för kommunikation och åtkomst av nätverksresurser 4 2
Java - Nätverksprogrammering TCP-baserade klasser: URL URLConnection Socket ServerSocket UDP- baserade klasser: DatagramPacket DatagramSocket, och MulticastSocket 5 Java- nätverksklasser Dessa klasser indelas i två kategorier: URLs Uniform Resource Locator Sockets API (Application Program Interface) åtkomst nätverksprotokoll 6 3
Java -URL En URL refererar till någon maskin (server) i ett nätverk (Internet) http://www.java.sun http://www.liu.se http: protokoll identifierare www.java.sun: resursnamn www.liu.se: resursnamn 7 Java -URL I ett Javaprogram kan man skapa ett objekt av klassen URL URL gamelan = new URL("http://www.gamelan.com"); en resurs kan vara: en mapp en fil en databasfråga 8 4
Java -URL URL aurl = new URL( http://java.sun.com:80/tutorial/ intro.html#downloading ); protocoll = http host = java.sun.com port = 80 [path/]filenamn = tutorial/intro.html ref = DOWNLOADING 9 10 5
Sockets Definition: A socketis one endpoint of a two-way communication link between two programs running on the network. A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent. Hugo Quisbert 11 Sockets Hugo Quisbert 12 6
Datagram import java.io.*; public class QuoteServer { public static void main(string[] args) throws IOException { new QuoteServerThread().start(); 13 import java.io.*; import java.net.*; import java.util.*; public class QuoteServerThread extends Thread { protected DatagramSocket socket = null; protected BufferedReader in = null; protected boolean morequotes = true; public QuoteServerThread() throws IOException { this("quoteserverthread"); public QuoteServerThread(String name) throws IOException { super(name); socket = new DatagramSocket(4445); try { in = new BufferedReader(new FileReader("one-liners.txt")); catch (FileNotFoundException e) { System.err.println("Could not open quote file. Serving time instead."); 14 7
datagram public void run() { while (morequotes) { try { byte[] buf = new byte[256]; // receive request DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); // figure out response String dstring = null; if (in == null) dstring = new Date().toString(); else dstring = getnextquote(); buf = dstring.getbytes(); ----> 15 datagram // send the response to the client at "address" and "port" InetAddress address = packet.getaddress(); int port = packet.getport(); packet = new DatagramPacket(buf, buf.length, address, port); socket.send(packet); catch (IOException e) { e.printstacktrace(); morequotes = false; socket.close(); 16 8
Datagram protected String getnextquote() { String returnvalue = null; try { if ((returnvalue = in.readline()) == null) { in.close(); morequotes = false; returnvalue = "No more quotes. Goodbye."; catch (IOException e) { returnvalue = "IOException occurred in server."; return returnvalue; 17 Datagram import java.io.*; import java.net.*; import java.util.*; public class QuoteClient { public static void main(string[] args) throws IOException { if (args.length!= 1) { System.out.println("Usage: java QuoteClient <hostname>"); return; // get a datagram socket DatagramSocket socket = new DatagramSocket(); 18 9
Datagram // send request byte[] buf = new byte[256]; InetAddress address = InetAddress.getByName(args[0]); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445); socket.send(packet); // get response packet = new DatagramPacket(buf, buf.length); socket.receive(packet); // display response String received = new String(packet.getData(), 0, packet.getlength()); System.out.println("Quote of the Moment: " + received); socket.close(); 19 Servelt med DB Access import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class DBServlet extends HttpServlet { protected void processrequest(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html;charset=utf-8"); PrintWriter out = response.getwriter(); String[][] dat; try { /* TODO output your page here. You may use following sample code. */ out.println("<html>"); out.println("<head>"); out.println("<title>servlet DBServlet</title>"); out.println("</head>"); out.println("<body>"); 20 10
Dervelt med DB Access out.println("<h1>servlet DBServlet at " + request.getcontextpath() + "</h1>"); DBAccess dbac = new DBAccess(); dat = dbac.getdata(); out.print(tohtmltable.totable(dat)); out.println("</body>"); out.println("</html>"); finally { out.close(); 21 import java.sql.*; public class DBAccess { static final String JDBC_DRIVER = "com.mysql.jdbc.driver"; static final String DATABASE_URL = "jdbc:mysql://localhost/mydb?" + "user=hugo_q&password=admin"; private java.sql.connection connection; private java.sql.statement statement; public String[][] getdata(){ String[][] results = new String[6][4]; try{ Class.forName(JDBC_DRIVER); connection = DriverManager.getConnection(DATABASE_URL); statement = connection.createstatement(); ResultSet resultset = statement.executequery( "SELECT * FROM kund"); resultset.getrow(); int i = 0; results[i][0] = "Namn"; results[i][1] = "Adress"; results[i][2] = "Tel"; results[i][3] = "E-post"; 22 11
while(resultset.next()){ //results[++i][j] = resultset.getstring("namn") + " " + resultset.getstring("adress") + " " + resultset.getstring("tel_nr") + " " + resultset.getstring("epost"); i++; results[i][0] = resultset.getstring("namn"); results[i][1] = resultset.getstring("adress"); results[i][2] = resultset.getstring("tel_nr"); results[i][3] = resultset.getstring("epost"); for(int k = 0; k < 6; k++){ for(int j = 0; j < 4; j++){ System.out.print(results[k][j].toString() + " "); statement.close(); connection.close(); System.out.println("Lots of data retrieved"); catch(classnotfoundexception cnfe){system.out.println(cnfe.tostring()); catch(sqlexception sqle){system.out.println(sqle.tostring()); return results; 23 public class ToHTMLTable { public static String totable(string[][] data){ StringBuilder html = new StringBuilder("<table>"); for(string elem:data[0]){ html.append("<th>").append(elem.tostring()).append("</th>"); for(int i = 1; i < data.length; i++){ String[] row = data[i]; html.append("<tr>"); for(string elem:row){ html.append("<td>").append(elem.tostring()).append("</td>"); html.append("</tr>"); html.append("</table>"); return html.tostring(); 24 12