java networking - ut · link internet network layers transport application this is as low as java...

71
Java Networking Java Fundamentals 2014, Tartu Neeme Praks @nemecec

Upload: others

Post on 27-Apr-2020

25 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Java Networking Java Fundamentals

2014, Tartu

Neeme Praks @nemecec

Page 2: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Hello world! URL url = new URL("http://www.google.com"); try (InputStream in = url.openStream()) { //read stuff (check the last lecture)}

Page 3: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Agenda

• Transport layer – sockets (client and server) o  TCP, UDP o Encryption o Blocking vs. non-blocking

• Application layer o Client

§ Built-in HTTP client § Custom protocol handlers

o Server § Embedding HTTP server § Custom servers

Page 4: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Link

Internet

Network layers

Transport

Application

This is as low as Java gets TCP UDP

IPv4 IPv6

HTTP FTP SMTP DNS SSH

10101101...

Page 5: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Transport layer

•  Java supports only TCP and UDP

•  SocketInputStream SocketOutputStream o  reading and writing raw bytes

•  Sockets o  TCP sockets – class Socket

o  UDP sockets – class DatagramSocket

Page 6: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Sockets

•  Software abstractions to networking

•  Data moves between local and remote sockets

•  Identified by o  Transport (TCP or UDP)

o  port number (0-65535)

•  Up to 65 535 sockets (per transport)

•  TCP 53 and UDP 53 are different ports!

Page 7: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Port ranges

0-1023 Publicly well-known ports 1024 - 49151 Registered ports 49152-65535 Dynamic / private ports TCP 80 HTTP TCP 443 HTTPS TCP 53 DNS UDP 53 DNS UDP 666 Doom (multiplayer game) http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

Page 8: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

TCP

•  Connection oriented – class Socket

•  Stream based – socket.get*Stream()

•  Easy to use! •  Maintains ordering

•  Retransmits lost packets

•  High(ish) overhead

Page 9: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

TCP client try ( Socket s = new Socket("google.com", 80); InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream();) { readAndWriteStuff(in, out);}

Page 10: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

TCP server try (ServerSocket srv = new ServerSocket(80)) { while (true) { Socket s = srv.accept(); //this will block readAndWriteStuff(s); }}

Page 11: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

TCP server Exception in thread "main" java.net.BindException: Permission denied

at java.net.PlainSocketImpl.socketBind(Native Method)at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:382)at java.net.ServerSocket.bind(ServerSocket.java:375)at java.net.ServerSocket.<init>(ServerSocket.java:237)at java.net.ServerSocket.<init>(ServerSocket.java:128)at slides.ExamplesOnSlides.tcpServer(ExamplesOnSlides.java:37)at slides.ExamplesOnSlides.main(ExamplesOnSlides.java:12)

Page 12: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Naïve server public NaiveServer(int port) { try (ServerSocket srv = new ServerSocket(port)) { while (true) { Socket s = srv.accept(); readAndWriteStuffInSameThread(s); } }}

Page 13: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Naïve client public NaiveClient(String host, int port) { try ( Socket s = new Socket(host, port); InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); ) { readAndWriteStuffOnClientInSameThread(in, out); }}

Page 14: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Naïve “main” method public static void main(String[] args) { int port = 8099; new NaiveClientServerV2(port); new NaiveClient("localhost", port); System.out.println("Server started!");}

Page 15: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Naïve server demo https://github.com/zeroturnaround/java-fundamentals

Sub-project “net” Package “naiveserver”

Page 16: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Threads

while (true) Socket socket = srv.accept();

•  Appropriate threading model needed o  Everything in one thread

o  Server in a separate thread

o  Separate thread per connection

§  Thread pools

Page 17: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Thread pool int NR_THREADS = 50;ExecutorService pool = Executors.newFixedThreadPool(NR_THREADS);//...Runnable command = new ClientHandler(socket);pool.execute(command);//...pool.shutdown();for (;;) { pool.awaitTermination(1, TimeUnit.MINUTES); System.out.println("Still waiting"); }

Page 18: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

UDP - User Datagram Protocol

•  Packet oriented (no streams)

•  Sends over some bytes

•  No concept of connection

•  "Fire and forget”

•  Multi-cast capable

Page 19: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

FAST!

Page 20: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

No guarantee of delivery

Packets can be out of order

Page 21: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Sending a datagram byte[] buf = "hello".getBytes("UTF-8");try (DatagramSocket sock = new DatagramSocket()) { DatagramPacket message = new DatagramPacket( buf, buf.length, InetAddress.getByName("localhost"), 6666); sock.send(message);}

Page 22: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Reading a datagram try (DatagramSocket sock = new DatagramSocket(6666)) { byte[] buf = new byte[8]; DatagramPacket message = new DatagramPacket(buf, buf.length); sock.receive(message); System.out.println(Arrays.toString(buf)); //[104, 101, 108, 108, 111, 0, 0, 0]}

WTF?

Page 23: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Reading a datagram byte[] result = new byte[message.getLength()];System.arraycopy(buf,0,result,0,result.length);System.out.println(Arrays.toString(result));//[104, 101, 108, 108, 111]

Page 24: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Datagram demo https://github.com/zeroturnaround/java-fundamentals

Sub-project “net” Package “datagram”

Page 25: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

UDP Applicability

•  Performance critical systems

•  Loss of a single packet = no big deal

•  DNS

•  Video streaming (multi-cast!)

•  VoIP

•  Some multiplayer games

Page 26: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Secure sockets

•  TCP only •  Works on top of regular sockets •  Between transport and application layers •  Only initial setup code changes

SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();Socket sock = factory.createSocket("www.gmail.com", 443);readAndWriteStuff(sock);

Page 27: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Socket Channels (NIO)

•  Buffer-oriented •  blocking and non-blocking •  can handle many sockets in one thread

•  Scalability!

•  closer to the OS. Better performance possible

Channel 1

Channel 2

Channel 1000

Selector handler

Page 28: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Socket Channel types

• FileChannel o  Files, only blocking mode

• DatagramChannel o UDP networking

• SocketChannel o  TCP networking

• ServerSocketChannel o  Listen for TCP connections -> SocketChannel

Page 29: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Channel <--> Buffer RandomAccessFile file = new RandomAccessFile("example.txt", "rw");FileChannel inChannel = file.getChannel();ByteBuffer buf = ByteBuffer.allocate(48);int bytesRead = inChannel.read(buf);while (bytesRead != -1) { System.out.println("Read " + bytesRead); buf.flip(); while(buf.hasRemaining()){ System.out.print((char) buf.get()); } buf.clear(); bytesRead = inChannel.read(buf);}file.close();

Page 30: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Socket Channels – start listen try (ServerSocketChannel server = ServerSocketChannel.open()) { server.configureBlocking(false); server.socket().bind(new InetSocketAddress(8888)); Selector selector = Selector.open(); server.register(selector, SelectionKey.OP_ACCEPT); //OP_CONNECT //OP_READ //OP_WRITE}

Page 31: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Socket Channels - events while (true) { selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); for (SelectionKey key : keys) { if (key.isAcceptable()) handleAccept(key); else if (key.isReadable()) handleRead(key); keys.remove(key); }}

Page 32: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

handleAccept (SelectionKey key) ServerSocketChannel srv = (ServerSocketChannel) key.channel();SocketChannel client = srv.accept();client.configureBlocking(false);client.register( key.selector(), SelectionKey.OP_READ);

Page 33: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

handleRead (SelectionKey key) SocketChannel client = (SocketChannel) key.channel();ByteBuffer buf = ByteBuffer.allocate(10);client.read(buf); buf.flip(); CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();String msg = decoder.decode(buf).toString();

Page 34: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Socket channels non-blocking demo

https://github.com/zeroturnaround/java-fundamentals Sub-project “net”

Package “nonblocking”

Page 35: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

NIO vs IO: high-level

IO • Stream oriented • Blocking IO

NIO • Buffer oriented • Blocking IO • Non-blocking IO • Selectors • More flexible • More complex

Page 36: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

NIO vs IO: IO API interaction

Source: http://tutorials.jenkov.com/java-nio/nio-vs-io.html

Reading data from a blocking stream.

Page 37: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

NIO vs IO: NIO API interaction

Source: http://tutorials.jenkov.com/java-nio/nio-vs-io.html

Reading data from a channel until all needed data is in buffer.

Page 38: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

NIO vs IO: IO threading model

Source: http://tutorials.jenkov.com/java-nio/nio-vs-io.html

A classic IO server design – one connection handled by one thread.

Page 39: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

NIO vs IO: NIO threading model

Source: http://tutorials.jenkov.com/java-nio/nio-vs-io.html

A single thread managing multiple connections.

Page 40: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

NIO vs IO: when to use which?

Hundreds of simultaneous connections

Thousands of simultaneous connections

Low bandwidth sockets

IO / NIO NIO

High bandwidth sockets

IO Depends

Page 41: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Transport Layer

•  Too Low level

•  Gets complicated very fast

•  YOU NEED A PROTOCOL

•  Use existing

or

•  Develop your own

Page 42: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Application layer

Transport level - bare sockets

Application level - a protocol !

Page 43: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

An application Layer Protocol

•  Defines message rules and formats

•  Solves complex communication issues

o  authentication

o  authorization

o  metadata

o  message boundaries

o  message structure

Page 44: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Pre-made Protocols

HTTP Web pages. And more FTP File transfer SMTP Sending e-mail IMAP Reading e-mail POP Downloading e-mail XMPP Instant messaging RTSP Video Streaming

(YouTube!!) BitTorrent Amazon S3, Diablo 3 patches

Page 45: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

HTTP

•  Started out as HyperText Transfer Protocol

•  Often used for exchanging messages

•  Many solutions built on top of HTTP o  SOAP (can also use e-mail )

o  REST

o  RSS

Page 46: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

HTTP Request GET / HTTP/1.1\r\n Host: www.neti.ee\r\n Connection: keep-alive\r\n Accept-Encoding: gzip,deflate,sdch\r\n Accept-Language: en-US,en;q=0.8\r\n Accept-Charset: ISO-8859-1,utf-8;\r\n \r\n

Page 47: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

HTTP Response HTTP/1.1 200 OK\r\n Date: Wed, 13 Feb 2013 21:17:13 GMT\r\nContent-Type: text/html\r\nContent-Length: 7909\r\nConnection: keep-alive\r\nContent-Encoding: gzip\r\nVary: Accept-Encoding\r\nETag: "1ee5-2b3ef24d"\r\nCache-Control: s-maxage=3600, max-age=57600\r\n\r\n <!DOCTYPE html PUBLIC...

Page 48: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

java.net.URL

•  Pointer to a resource (on the web)

URL url = new URL("http://www.google.com");URL relative = new URL(url, "page?q=asdf");URL pieces = new URL( "https", "google.com", 8443, "/page?q=asdf");URL file = new URL("file:/C:/Windows");URL custom = new URL("custom:/doStuff");

Page 49: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

java.net.URLConnection

•  communications link to destination •  connection = url.openConnection();

•  Can set headers o  connection.setRequestProperty("key", "value");

•  Can read response headers o  connection.getHeaderField("name");

•  Open streams for reading and writing o  connection.get*Stream();

Page 50: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Sending stuff HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setDoOutput(true);try ( OutputStreamWriter out = new OutputStreamWriter( conn.getOutputStream(), "UTF-8")) { out.write("Hello World!"); out.flush();}

Page 51: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

URL and Custom Protocols URL url = new URL("custom:/doStuff");url.openStream();CustomUrlConnection conn = (CustomUrlConnection) url.openConnection();conn.petTheKitty(true);

Page 52: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

stuff to implement / subclass

•  URLStreamHandler o  openConnection(URL url)

•  URLConnection o  connect()

o  getInputStream()

o  getOutputStream()

•  URLStreamHandlerFactory o  createURLStreamHandler(String protocol)

•  URL.setURLStreamHandlerFactory(myFactory)

Page 53: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Embedding HTTP server

•  Client side HTTP is easy

•  No built in HTTP server

Solutions

•  Deploy java app to server (java EE)

•  Embed http server to application

•  Use an HTTP library

Page 54: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Embedding Jetty final int PORT=8080;Server jettySrv = new Server(PORT);jettySrv.setHandler(new MyMessageHandler());jettySrv.start();jettySrv.join();

Page 55: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

MyMessageHandler extends AbstractHandler

public void handle( String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException { baseRequest.setHandled(true); response.getWriter().println("Hello world"); response.setStatus(HttpServletResponse.SC_OK);}

Page 56: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

jetty in pom.xml <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>9.2.2.v20140723</version></dependency><!-- optional --><dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> <version>9.2.2.v20140723</version></dependency>

Page 57: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Apache HttpComponents

•  Apache HttpComponents o  great for implementing HTTP endpoints

o  low level (compared to embedded servers)

o  high performance, minimal memory footprint

•  Apache HttpComponents Client o  powerful HTTP client

o  more options than URLConnection

Page 58: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

HttpComponents Client CloseableHttpClient client = HttpClientBuilder.create().build();HttpPost request = new HttpPost("http://...");request.setHeader("key", "value");request.setEntity(new ByteArrayEntity(content));HttpResponse response = client.execute(request);EntityUtils.toByteArray(response.getEntity());Header[] headers = response.getHeaders("headerName");

Page 59: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

JAX-RS (REST services)

•  JAX-RS (java EE standard)

•  automatic json & xml serialization

•  Usually run in server o  also work in embedded mode

o  servers can be embedded

•  Implementations: Resteasy, Jersey

Page 60: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

JAX-RS sample @Path("greeting")public class GreetingService { @POST @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) public ComplexGreeting invoke(Salute input) { return new ComplexGreeting(input); } }

Page 61: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

HTTP has too high overhead?

Page 62: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Custom protocol - considerations

• Payload overhead / serialization format • Schema evolution • Platform interoperability • Ease of debugging • Unknown field handling • etc See also http://kentonv.github.io/capnproto/next/news/2014-06-17-capnproto-flatbuffers-sbe.html

Page 63: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Custom protocol – frameworks

• Cap’n Proto http://kentonv.github.io/capnproto/

• FlatBuffers http://google.github.io/flatbuffers/

• SBE https://github.com/real-logic/simple-binary-encoding

• Google protobuf https://developers.google.com/protocol-buffers/ • Thrift http://thrift.apache.org/ • Avro http://avro.apache.org/

• etc

Page 64: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Custom servers for those protocols

• Netty (http://netty.io/) • Grizzly (https://grizzly.java.net/) • MINA (https://mina.apache.org/) • Probably more

Page 65: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Homework

Page 66: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Chat Server!

•  Chat client is provided (with source)

•  Implement server side

•  Must work with that client

https://github.com/zeroturnaround/jf-chatclient

Page 67: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101
Page 68: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Requirements

•  TCP socket endpoint, listen on port 8888 o  ChatClient connects and prints a name

o  use socket to send chat messages to clients

•  HTTP endpoint, listen on port 8080 o  ChatClient makes HTTP POST request

§  author's name in header "author" §  message in request body

o  server handles request, sends received message to all participants

Page 69: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Requirements

•  Response messages are constructed by

author + ": " + message

•  reading raw HTTP is not allowed •  Possible options

o  Embedded Jetty server (http://wiki.eclipse.org/Jetty) o  Embedded Tomcat server (http://tomcat.apache.org) o  HTTPComponents (http://hc.apache.org/) o  Netty (http://netty.io/) o  Some other framework or library

Page 70: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Requirements

Use jf-skeleton in GitHub https://github.com/zeroturnaround/jf-skeleton/

Submit zipped source code via email to [email protected]

Deadline: next Monday, 29th of September 16:00

Describe in a few sentences which endpoint was trickier to implement and why.

Page 71: Java Networking - ut · Link Internet Network layers Transport Application This is as low as Java gets TCP UDP IPv4 IPv6 HTTP FTP SMTP DNS SSH 10101101

Thank you

•  Chat client for homework https://github.com/zeroturnaround/jf-chatclient

•  Skeleton project for homework https://github.com/zeroturnaround/jf-skeleton/

•  Very good tutorial about “Java networking” http://tutorials.jenkov.com/java-networking/