Gästföreläsningen. Synpunkter?

Relevanta dokument
Gästföreläsningen. Synpunkter?

Erfarenheter från biljardprojektet. måndag 23 november 15

Klasser som datastrukturer

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

OOP Objekt-orienterad programmering

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Fördjupad Java. Undantagshantering. Fel

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Att skriva till och läsa från terminalfönstret

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Surfning. Webbklienter och webbservrar. Specialskrivna webbservrar. Kommunikation med sockets

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 2, vecka 8: Repetition

Språkkonventioner och redigering av tal.

Föreläsning 6: Metoder och fält (arrays)

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

F4. programmeringsteknik och Matlab

Föreläsning 14. Filhantering

Lösningar för tenta 2 DAT043,

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamensskrivning Nätverksprogrammering (EDA095 - FED) , kl 8-13

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

Föreläsnings 9 - Exceptions, I/O

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Objektorienterad programmering i Java

F2 Java I/O - strömmar Meddelandesändning med TCP

Sammanfattning och repetition utgående från typiska tentamensuppgifter

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

10 Kommunikation i Java

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Laboration 1 - Grunderna för OOP i Java

JAVA Mer om klasser och objektorientering

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Föreläsning 3. Stack

Tentamen Nätverksprogrammering Lösningsförslag

Objektorienterad Programmering (TDDC77)

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Föreläsning 3-4 Innehåll

Lösningsförslag övning 2.

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

2 b) Bodega bodegan = new Bodega(); double moms = 0.235; String namn = "Vargtass"; System.out.println(namn + " " + moms + bodegan.ändra(moms, namn); S

Skillnader mellan Python och Java

Föreläsning 11 Aktiva objekt och trådar, strömmar, kommunikation DAT043,

Classes och Interfaces, Objects och References, Initialization

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 8 - del 1: Objektorienterad programmering (forts.) - Exempel

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 7 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TENTAMEN OOP

Tentamen OOP

Tentamen , Introduktion till Java, dtaa98, dtea53

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Föreläsning REPETITION & EXTENTA

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

1 Comparator & Comparable

Föreläsning 5-6 Innehåll

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

SMD 134 Objektorienterad programmering

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Del A (obligatorisk för alla)

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Transkript:

Gästföreläsningen Synpunkter?

Erfarenheter från biljardprojektet

Var ska koden ligga? Som i labben: anta klasserna Table och Ball En metod bounce() ska skrivas som anger vad som händer när två bollar studsar mot varandra Vi har kodat mekanikformlerna Den anropas av move() i Ball Var ska metoden ligga?

I klassen Ball Som static i klassen Ball I klassen Table Som static i klassen Table Samtliga är tänkbara Hur ser metodhuvudet ut? Hur anropas metoden? Vilket är bäst?

I klassen Ball En boll gör en studs mot en annan boll

I klassen Ball En boll gör en studs mot en annan boll Deklaration (i Ball) private void bounce(ball otherball) { velocity = otherballvelocity =

I klassen Ball En boll gör en studs mot en annan boll Deklaration (i Ball) private void bounce(ball otherball) { velocity = otherballvelocity = Anrop i move(): for (Ball ball : balllist) { if (ball!= this) bounce(ball);

static i klassen Ball En bollstuds sker mellan två bollar

static i klassen Ball En bollstuds sker mellan Deklaration (i Ball) två bollar static private void bounce (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity =

static i klassen Ball En bollstuds sker mellan Deklaration (i Ball) två bollar static private void bounce (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity = Anrop i move(): for (Ball ball : balllist) { if (ball!= this) bounce(this, ball);

Bordet gör en studs I klassen Table mellan två bollar

Bordet gör en studs I klassen Table mellan två bollar Deklaration (i Table) private void bounce (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity =

Bordet gör en studs I klassen Table mellan två bollar Deklaration (i Table) private void bounce (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity = Anrop i move(): for (Ball ball : balllist) { if (ball!= this) mytablebounce(this, ball);

Bordet gör en studs I klassen Table mellan två bollar Deklaration (i Table) private void bounce (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity = Anrop i move(): for (Ball ball : balllist) { if (ball!= this) mytablebounce(this, ball);

Bordet gör en studs I klassen Table mellan två bollar Deklaration (i Table) private void bounce (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity = Anrop i move(): Omöjligt om velocity är private i Ball for (Ball ball : balllist) { if (ball!= this) mytablebounce(this, ball);

som static i klassen Table En bordsstuds sker mellan två bollar

som static i klassen Table Deklaration (i Table) static private void bounce En bordsstuds sker mellan två bollar (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity =

som static i klassen Table Deklaration (i Table) static private void bounce En bordsstuds sker mellan två bollar (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity = Anrop i move(): for (Ball ball : balllist) { if (ball!= this) Tablebounce(this, ball);

som static i klassen Table Deklaration (i Table) static private void bounce En bordsstuds sker mellan två bollar (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity = Anrop i move(): for (Ball ball : balllist) { if (ball!= this) Tablebounce(this, ball);

som static i klassen Table Deklaration (i Table) static private void bounce (Ball firstball, Ball secondball) { firstballvelocity = secondballvelocity = En bordsstuds sker mellan två bollar Omöjligt om velocity är private i Ball Anrop i move(): for (Ball ball : balllist) { if (ball!= this) Tablebounce(this, ball);

Tumregler Lägg den i den klass som beskriver subjektet i en mening där metoden är predikatet En boll gör en studs mot en annan boll En bollstuds sker mellan två bollar Bordet gör en studs mellan två bollar En bordsstuds sker mellan två bollar Lägg den i den klass som innehåller de instansvariabler som används mest Talar för klassen Ball

Övning: klassen Hole På biljardbordet ska finnas hål Vi gör alltså en klass Hole för att representera dem Vilka metoder ska finnas där? Vad ska andra objekt kunna göra med hål?

class Hole { För att rita upp hålet void paintme (Graphics g) { För att avgöra om en position ligger i hålet boolean isin (Coord position) {

I move(): Gå igenom alla hål for (Hole hole : holelist) { if (holeisin(position) falloff(); Låt hålet kolla om bollen ligger i Ny metod som aktiveras när boll faller i hål

Tex, om hålet är runt: class Hole { private Coord holeposition; private double radius; void paintme (Graphics g) { gsetcolor() gfilloval() boolean isin (Coord position) { return Coorddistance(holePosition, position) < radius

class Hole { private Coord holeposition; private double xsize, ysize; void paintme (Graphics g) { Eller, om hålet är fyrkantigt: gsetcolor() gfillrect() boolean isin (Coord position) { return positionx > holepositionx && positionx < holepositionx + xsize && positiony > holepositiony && positiony < holepositiony + ysize

Instansvariabler - klassvariabler - konstanter Vad ska vara static? Vad ska vara final?

Instansvariabel private int radius = 30; Varje boll har en radie Den kan vara olika för olika bollar Den kan ändras under programmets gång

Instansvariabel Deklaration (i Ball) private int radius = 30; Varje boll har en radie Den kan vara olika för olika bollar Den kan ändras under programmets gång

klassvariabel static private int radius = 30; Varje boll har en radie Den är samma för alla bollar Den kan ändras under programmets gång (dvs, då ändras alla bollars radie)

klassvariabel Deklaration (i Ball) static private int radius = 30; Varje boll har en radie Den är samma för alla bollar Den kan ändras under programmets gång (dvs, då ändras alla bollars radie)

instanskonstant final private int radius; Varje boll har en radie Den kan vara olika för olika bollar (får sitt värde i konstruktorn) Den kan inte ändras under programmets gång

instanskonstant Deklaration (i Ball) final private int radius; Varje boll har en radie Den kan vara olika för olika bollar (får sitt värde i konstruktorn) Den kan inte ändras under programmets gång

klasskonstant static final private int radius = 30; Varje boll har en radie Den är samma för alla bollar Den kan inte ändras under programmets gång

klasskonstant Deklaration (i Ball) static final private int radius = 30; Varje boll har en radie Den är samma för alla bollar Den kan inte ändras under programmets gång

static metoder Kopplas till klassen (inte till varje objekt) Har alltså inget aktivt objekt när de kör Kan alltså inte komma åt instansvariabler Inte heller andra icke-static metoder

Tumregel: Undvik static metoder så långt du kan

Huvudklassens main() måste vara static Alltså: den har inget aktivt objekt när den kör Alltså: de enda metoder den kan anropa är också static Vanligt nybörjarfel: så kallad mainprogrammering: för många metoder och variabler blir static

main-programmering public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() {

main-programmering public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() {

main-programmering public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() {

main-programmering public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() {

main-programmering public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() {

main-programmering public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); Alla variabler och static void initialize() { myball = new Ball() static void moveall() { metoder blir static! Därmed kan inte objektorientering utnyttjas

public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() { klassvariabler för MyProject Ball myball boolean simulating = false

public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() { klassvariabler för MyProject Ball myball boolean simulating = false

public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() { klassvariabler för MyProject Ball myball boolean simulating = false

public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() { klassvariabler för MyProject Ball myball boolean simulating = false

public class MyProject { static Ball myball; static boolean simulating = true; public static void main(string[] args) { initialize(); while (simulating) moveall(); static void initialize() { myball = new Ball() static void moveall() { klassvariabler för MyProject Ball myball boolean simulating = false

Bättre: public class MyProject { public static void main(string[] args) { new Startsimulation(); class Startsimulation() { Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

Bättre: public class MyProject { public static void main(string[] args) { new Startsimulation(); Det enda main gör är att skapa en instans av en class Startsimulation() { ny klass Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

Bättre: public class MyProject { public static void main(string[] args) { new Startsimulation(); Det enda main gör är att skapa en instans av en class Startsimulation() { ny klass Ball myball; boolean simulating = true; Den nya klassen har instansvariablerna Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

Bättre: public class MyProject { public static void main(string[] args) { new Startsimulation(); Det enda main gör är att skapa en instans av en class Startsimulation() { ny klass Ball myball; boolean simulating = true; Den nya klassen har instansvariablerna Startsimulation () { initialize(); while (simulating) moveall(); Konstruktorn gör det som förut gjordes i main void initialize() { void moveall() {

Bättre: public class MyProject { public static void main(string[] args) { new Startsimulation(); Det enda main gör är att skapa en instans av en class Startsimulation() { ny klass Ball myball; boolean simulating = true; Den nya klassen har instansvariablerna Startsimulation () { initialize(); while (simulating) moveall(); Konstruktorn gör det som förut gjordes i main void initialize() { void moveall() { metoderna är inte längre static

public class MyProject { public static void main(string[] args) { new Startsimulation(); class Startsimulation() { Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

public class MyProject { public static void main(string[] args) { new Startsimulation(); class Startsimulation() { Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

public class MyProject { public static void main(string[] args) { new Startsimulation(); objekt av typ Startsimulation boolean simulating = true Ball myball void initalize() void moveall() class Startsimulation() { Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

public class MyProject { public static void main(string[] args) { new Startsimulation(); objekt av typ Startsimulation boolean simulating = true Ball myball void initalize() void moveall() class Startsimulation() { Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

public class MyProject { public static void main(string[] args) { new Startsimulation(); objekt av typ Startsimulation boolean simulating = true Ball myball void initalize() void moveall() class Startsimulation() { Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

public class MyProject { public static void main(string[] args) { new Startsimulation(); objekt av typ Startsimulation boolean simulating = true Ball myball void initalize() void moveall() class Startsimulation() { Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

public class MyProject { public static void main(string[] args) { new Startsimulation(); objekt av typ Startsimulation boolean simulating = true Ball myball void initalize() void moveall() class Startsimulation() { Ball myball; boolean simulating = true; Startsimulation () { initialize(); while (simulating) moveall(); void initialize() { void moveall() {

Array vs ArrayList Array: Påminner om matlabs arrayer ArrayList: påminner om Pythons listor

Array ArrayList

Array ArrayList Ball [] theballs = new Ball []

Array ArrayList Ball [] theballs = new Ball [] ArrayList<Ball> theballs = new ArrayList<Ball>()

Array ArrayList Ball [] theballs = new Ball [] ArrayList<Ball> theballs = new ArrayList<Ball>() theballs[i] = new Ball()

Array ArrayList Ball [] theballs = new Ball [] ArrayList<Ball> theballs = new ArrayList<Ball>() theballs[i] = new Ball() theballsset(i, new Ball())

Array ArrayList Ball [] theballs = new Ball [] ArrayList<Ball> theballs = new ArrayList<Ball>() theballs[i] = new Ball() theballsset(i, new Ball()) theballs[i]

Array ArrayList Ball [] theballs = new Ball [] ArrayList<Ball> theballs = new ArrayList<Ball>() theballs[i] = new Ball() theballsset(i, new Ball()) theballs[i] theballsget(i)

Array ArrayList Ball [] theballs = new Ball [] ArrayList<Ball> theballs = new ArrayList<Ball>() theballs[i] = new Ball() theballsset(i, new Ball()) theballs[i] theballsget(i) theballsadd(new Ball())

Array ArrayList Ball [] theballs = new Ball [] ArrayList<Ball> theballs = new ArrayList<Ball>() theballs[i] = new Ball() theballsset(i, new Ball()) theballs[i] theballsget(i) theballsadd(new Ball()) theballsremove(aball)

Array ArrayList Ball [] theballs = new Ball [] ArrayList<Ball> theballs = new ArrayList<Ball>() theballs[i] = new Ball() theballsset(i, new Ball()) theballs[i] theballsget(i) finns inte theballsadd(new Ball()) theballsremove(aball)

Tumregler Array är enklare om allt du vet hur stor den är och storleken inte ändras ArrayList behövs om du vill lägga till och ta bort element

Kardinalfel: ändra i den struktur du loopar över for (Ball ball : balllist) { balllistremove(ball)

Kardinalfel: ändra i den struktur du loopar över Gör aldrig detta (Har du tur får du felmeddelande men det är inte säkert)

Exceptions http://downloadoraclecom/javase/tutorial/essential/exceptions/ Division med 0 Array index out of bounds File not found onormal I/O-händelse Null reference

try - catch Python Java try: a = 1/b except: a = 0 try { a = 1/b; catch (Exception e) { a = 0; except i Python heter catch i Java Inga kolon, men krullparanteser Man måste alltid ange vilka exceptions som avses inom parantes efter catch

try statement try block catch block aka catch clause aka exception handler try { a = 1/b; catch (Exception e) { a = 0; Grundidé: Börja köra try block Om ett fel inträffar avbryt, och kör catch block

try { c1; c2; catch (Exception e) { c3; c4; c5; Allt OK c1 c2 Exception inträffar c3 c4 c5

Exception classes Detta är bara en liten del! Jfr Horstmann s339 En stor hierarki av klasser

Varje klass svarar mot en typ av exception

Varje klass svarar mot en typ av exception Klasserna är ordnade hierarkiskt och underklasserna ärver överklasserna på vanligt sätt

Varje klass svarar mot en typ av exception Klasserna är ordnade hierarkiskt och underklasserna ärver överklasserna på vanligt sätt Exempel: Exception är en klass för alla slags exception IOException är en underklass för en del exceptions, nämligen de som orsakas av IO

Varje klass svarar mot en typ av exception Klasserna är ordnade hierarkiskt och underklasserna ärver överklasserna på vanligt sätt Exempel: Exception är en klass för alla slags exception IOException är en underklass för en del exceptions, nämligen de som orsakas av IO I varje catch ska man alltid deklarera vilken typ av exception som man ska fånga

Varje klass svarar mot en typ av exception Klasserna är ordnade hierarkiskt och underklasserna ärver överklasserna på vanligt sätt Exempel: Exception är en klass för alla slags exception IOException är en underklass för en del exceptions, nämligen de som orsakas av IO I varje catch ska man alltid deklarera vilken typ av exception som man ska fånga Till ett try can finnas flera catch för att fånga olika typer av exception

try { Ett kodblock som kan ge upphov till många olika exception catch (IndexOutOfBoundsException e) { Kodblock som hanterar indexeringsfel catch (IOException e) { Kodblock som hanterar IO-fel Beroende på vilket slags exception som inträffar i try blocket kommer man till rätt catch block Try blocket måste ha minst ett catch block

Exception objects När exception inträffar skapar Java ett objekt: en instans av klassen Objektet innehåller information om vad som hänt Objektet kan man komma åt i motsvarande catch

Typexempel: Exception object catch (IndexOutOfBoundsException e) { Systemoutprintln( Exception + egetmessage() ) Använd exception object för att få felmeddelande Till exempel har ett sådant objekt ett meddelande som nås med metoden getmessage()

Objektets namn skrivs efter klassnamnet inom paranteserna efter catch Det ser alltså lite ut som en deklaration Objektnamnet räknas som en lokal variabel med scope som är resten av denna catch clause

finally Efter alla catch block får det finnas (men måste inte finnas) ett finally block Det utförs hur try blocket än avslutas - vare sig någon exception inträffat eller ej Även om try blocket avslutas med en return eller break Användning: för att säkerställa att reserverade resurser (tex filer) släpps

Grundmönster för IO try { Ett kodblock som öppnar en fil/enhet och försöker läsa/skriva catch (IOException e) { Kod som upplyser användaren om att något gick fel finally { Kod som stänger filen/enheten

Checked exceptions

Checked exceptions Terminologi: exception inträffar = exception kastas, exception is thrown

Checked exceptions Terminologi: exception inträffar = exception kastas, exception is thrown En del exception classes kallas checked

Checked exceptions Terminologi: exception inträffar = exception kastas, exception is thrown En del exception classes kallas checked De som programmeraren borde förutse och ta hand om

Checked exceptions Terminologi: exception inträffar = exception kastas, exception is thrown En del exception classes kallas checked De som programmeraren borde förutse och ta hand om Typexempel: IOException

Checked exceptions Terminologi: exception inträffar = exception kastas, exception is thrown En del exception classes kallas checked De som programmeraren borde förutse och ta hand om Typexempel: IOException En metod som kan kasta ett sådant måste antingen själv ta hand om det i en catch eller tydligt deklarera att anroparen måste ta hand om det

En metod som läser fil och hanterar eventuella exception själv: void readfile() { try { Ett kodblock som öppnar en fil och försöker läsa kan kasta ett IOException catch (IOException e) { Kod som upplyser om att något gick fel vid läsning finally { Kod som stänger filen

En metod som läser fil och låter anroparen hantera exceptions Ny deklaration i metodhuvudet void readfile() throws IOException { Ett kodblock som öppnar en fil och försöker läsa Notera: ingen try - catch här Med ordet throws följt av exceptiontyp deklareras att metoden kan kasta sådana exceptions utan att själv fånga dem De bör fångas av anroparen

En metod som läser fil och låter anroparen hantera exceptions Ny deklaration i metodhuvudet void readfile() throws IOException { Ett kodblock som öppnar en fil och försöker läsa Notera: ingen try - catch här Med ordet throws följt av exceptiontyp deklareras att metoden kan kasta sådana exceptions utan att själv fånga dem De bör fångas av anroparen try { readfile() catch (IOException e) {

OBS: Java håller jättenoga reda på vad som kan orsaka IOException (och andra checked exceptions)

OBS: Java håller jättenoga reda på vad som kan orsaka IOException (och andra checked exceptions) Om du använder något sådant - tex öppnar en fil - så vet Java det

OBS: Java håller jättenoga reda på vad som kan orsaka IOException (och andra checked exceptions) Om du använder något sådant - tex öppnar en fil - så vet Java det Du måste ta hand om ett IOException i en catch Annars kompileringsfel (netbeans protesterar och du kan inte ens köra programmet)

OBS: Java håller jättenoga reda på vad som kan orsaka IOException (och andra checked exceptions) Om du använder något sådant - tex öppnar en fil - så vet Java det Du måste ta hand om ett IOException i en catch Annars kompileringsfel (netbeans protesterar och du kan inte ens köra programmet) Antingen i samma metod där IOException kan inträffa, eller i den anropande metoden

OBS: Java håller jättenoga reda på vad som kan orsaka IOException (och andra checked exceptions) Om du använder något sådant - tex öppnar en fil - så vet Java det Du måste ta hand om ett IOException i en catch Annars kompileringsfel (netbeans protesterar och du kan inte ens köra programmet) Antingen i samma metod där IOException kan inträffa, eller i den anropande metoden I det senare fallet måste du skriva throws IOException i huvudet på den metod som ger upphov till det

Sammanfattning try { catch (Exception e) { finally { Får finnas flera catch Varje måste ange felklass lokal variabel e är ett exceptionobjekt finally är bra för att släppa resurser En metod som kan åstadkomma IOException måste antingen fånga dem själv eller deklareras med throws IOException

Javas IOsystem http://downloadoraclecom/javase/tutorial/essential/io/ Uppbyggt runt så kallade strömmar (stream) En ström: enkelriktad överföring av data Input stream: från något externt till programmet Output stream: från programmet till något externt Externt : ex annan enhet, fil, url, annan dator import javaio*;

Lokal användare Systemin Javaprogram Filer Andra datorer via internet xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx

Strömtyper Olika slags strömmar för att överföra olika slags saker Byte stream Character stream Data stream Object stream

Strömtyper = klasser ObjectOutputStream DataInputStream FileReader Som alltid: omöjligt att lära sig allt Lär dig ett exempel som funkar och var du ska slå upp information

Strömmar = objekt

Strömmar = objekt Instansiera en klass för att få en ström

Strömmar = objekt Instansiera en klass för att få en ström Typiskt: konstruktorn har en parameter som talar om vart strömmen leder

Strömmar = objekt Instansiera en klass för att få en ström Typiskt: konstruktorn har en parameter som talar om vart strömmen leder ex: new FileReader("wordstxt")

Strömmar = objekt Instansiera en klass för att få en ström Typiskt: konstruktorn har en parameter som talar om vart strömmen leder ex: new FileReader("wordstxt") Detta returnerar en inputström från filen wordstxt

Strömmar = objekt Instansiera en klass för att få en ström Typiskt: konstruktorn har en parameter som talar om vart strömmen leder ex: new FileReader("wordstxt") Detta returnerar en inputström från filen wordstxt Den bör bindas till en variabel så att vi kan använda den, ex wordsinput = new FileReader("wordstxt")

Strömmar = objekt Instansiera en klass för att få en ström Typiskt: konstruktorn har en parameter som talar om vart strömmen leder ex: new FileReader("wordstxt") Detta returnerar en inputström från filen wordstxt Den bör bindas till en variabel så att vi kan använda den, ex wordsinput = new FileReader("wordstxt") Sådana variabler ska förstås deklareras som alla andra Ofta ligger viktiga strömmar i instansvariabler

read / write

read / write Inputströmobjekt har metoder för att läsa från strömmen

read / write Inputströmobjekt har metoder för att läsa från strömmen Typiskt heter de något med read Exakt vad och vilken signatur beror på strömmen Ex: readobject()

read / write Inputströmobjekt har metoder för att läsa från strömmen Typiskt heter de något med read Exakt vad och vilken signatur beror på strömmen Ex: readobject() På samma sätt har outputströmmar metoder för att skriva till strömmen

read / write Inputströmobjekt har metoder för att läsa från strömmen Typiskt heter de något med read Exakt vad och vilken signatur beror på strömmen Ex: readobject() På samma sätt har outputströmmar metoder för att skriva till strömmen Alla metoder för att skapa, skriva till eller läsa från strömmar kan kasta IOException, och måste ha exception handlers

Exempel: filkopiering FileReader inputstream = null; FileWriter outputstream = null; Skapar strömmar try { till och från filer inputstream = new FileReader("xanadutxt"); outputstream = new FileWriter("characteroutputtxt"); int c; while ((c = inputstreamread())!= -1) { outputstreamwrite(c); catch (IOException e) { Systemoutprintln( Error: +egetmessage()); finally { if (inputstream!= null) inputstreamclose(); if (outputstream!= null) outputstreamclose(); inputstreamread() läser ett tecken i form av heltal Dito för outputstreamwrite() Exception kan kastas när vi skapar, läser eller skriver Se till att stänga filerna när vi är klara

Exempel: filkopiering FileReader inputstream = null; FileWriter outputstream = null; Skapar strömmar try { till och från filer inputstream = new FileReader("xanadutxt"); outputstream = new FileWriter("characteroutputtxt"); int c; while ((c = inputstreamread())!= -1) { outputstreamwrite(c); catch (IOException e) { Systemoutprintln( Error: +egetmessage()); finally { if (inputstream!= null) inputstreamclose(); if (outputstream!= null) outputstreamclose(); inputstreamread() läser ett tecken i form av heltal Dito för outputstreamwrite() Exception kan kastas när vi skapar, läser eller skriver Se till att stänga filerna när vi är klara

Exempel: filkopiering FileReader inputstream = null; FileWriter outputstream = null; Skapar strömmar try { till och från filer inputstream = new FileReader("xanadutxt"); outputstream = new FileWriter("characteroutputtxt"); int c; while ((c = inputstreamread())!= -1) { outputstreamwrite(c); catch (IOException e) { Systemoutprintln( Error: +egetmessage()); finally { if (inputstream!= null) inputstreamclose(); if (outputstream!= null) outputstreamclose(); inputstreamread() läser ett tecken i form av heltal Dito för outputstreamwrite() Exception kan kastas när vi skapar, läser eller skriver Se till att stänga filerna när vi är klara

Exempel: filkopiering FileReader inputstream = null; FileWriter outputstream = null; Skapar strömmar try { till och från filer inputstream = new FileReader("xanadutxt"); outputstream = new FileWriter("characteroutputtxt"); int c; while ((c = inputstreamread())!= -1) { outputstreamwrite(c); catch (IOException e) { Systemoutprintln( Error: +egetmessage()); finally { if (inputstream!= null) inputstreamclose(); if (outputstream!= null) outputstreamclose(); inputstreamread() läser ett tecken i form av heltal Dito för outputstreamwrite() Exception kan kastas när vi skapar, läser eller skriver Se till att stänga filerna när vi är klara

Exempel: filkopiering FileReader inputstream = null; FileWriter outputstream = null; Skapar strömmar try { till och från filer inputstream = new FileReader("xanadutxt"); outputstream = new FileWriter("characteroutputtxt"); int c; while ((c = inputstreamread())!= -1) { outputstreamwrite(c); catch (IOException e) { Systemoutprintln( Error: +egetmessage()); finally { if (inputstream!= null) inputstreamclose(); if (outputstream!= null) outputstreamclose(); inputstreamread() läser ett tecken i form av heltal Dito för outputstreamwrite() Exception kan kastas när vi skapar, läser eller skriver Se till att stänga filerna när vi är klara

Exempel: ObjectStream Den mest generella strömmen Kan transportera objekt av skilda slag ObjectOutputStream och ObjectInputStream Wrapping: Konstruktorn tar en parameter som är en dataström Returnerar en objektström som använder denna

Javaprogram mystream xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx

Javaprogram mystream xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx ObjectInputStream myobjectstream = new ObjectInputStream(myStream)

Javaprogram myobjectstream mystream xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx xxx xxxxxx xx xx xxxxxxx xxxx xxxxxxxxx xxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx ObjectInputStream myobjectstream = new ObjectInputStream(myStream)

ObjectOutputStream har en metod writeobject()

ObjectOutputStream har en metod writeobject() Den är void och tar en parameter: det objekt som ska skrivas

ObjectOutputStream har en metod writeobject() Den är void och tar en parameter: det objekt som ska skrivas parametern måste implementera det speciella interfacet Serializable

ObjectOutputStream har en metod writeobject() Den är void och tar en parameter: det objekt som ska skrivas parametern måste implementera det speciella interfacet Serializable Interfacet är tomt men talar om för Java att finna ett sätt att överföra objekten

ObjectOutputStream har en metod writeobject() Den är void och tar en parameter: det objekt som ska skrivas parametern måste implementera det speciella interfacet Serializable Interfacet är tomt men talar om för Java att finna ett sätt att överföra objekten De flesta enkla klasser som String implementerar detta

ObjectOutputStream har en metod writeobject() Den är void och tar en parameter: det objekt som ska skrivas parametern måste implementera det speciella interfacet Serializable Interfacet är tomt men talar om för Java att finna ett sätt att överföra objekten De flesta enkla klasser som String implementerar detta Vill du att objekten i en egen klass ska kunna skickas skriv implements Serializable i klasshuvudet

ObjectOutputStream har en metod writeobject() Den är void och tar en parameter: det objekt som ska skrivas parametern måste implementera det speciella interfacet Serializable Interfacet är tomt men talar om för Java att finna ett sätt att överföra objekten De flesta enkla klasser som String implementerar detta Vill du att objekten i en egen klass ska kunna skickas skriv implements Serializable i klasshuvudet

ObjectInputStream har en metod readobject()

ObjectInputStream har en metod readobject() Den har inga parametrar och returnerar något av typ Object

ObjectInputStream har en metod readobject() Den har inga parametrar och returnerar något av typ Object Object är Javas översta klass i klasshierarkin: alla klasser är underklasser till Object

ObjectInputStream har en metod readobject() Den har inga parametrar och returnerar något av typ Object Object är Javas översta klass i klasshierarkin: alla klasser är underklasser till Object Använd casting för att specifiera objektet närmare

ObjectInputStream har en metod readobject() Den har inga parametrar och returnerar något av typ Object Object är Javas översta klass i klasshierarkin: alla klasser är underklasser till Object Använd casting för att specifiera objektet närmare Exempel: läs en String message = (String)myObjectStreamreadObject(); Downcasting till String Gör så att högerledet anses ha typ String Om det i själva verket har annan typ kastas ett exception

Idiom try { String message = (String)myObjectStreamreadObject(); process the message as a String catch (ClassNotFoundException e) { Systemoutprintln("Unknown object received");

class MyData implements Serializable { int a; String name; Exempel: Lagra ett objekt på en fil MyData dataitem = ; ObjectOutputStream output; try { output = new ObjectOutputStream( new FileOutputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { outputwriteobject(dataitem); catch (IOException e) { Systemoutprintln ( Error writing to file );

class MyData implements Serializable { int a; String name; Exempel: Lagra ett objekt på en fil MyData dataitem = ; ObjectOutputStream output; try { output = new ObjectOutputStream( new FileOutputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { outputwriteobject(dataitem); catch (IOException e) { Systemoutprintln ( Error writing to file );

class MyData implements Serializable { int a; String name; Exempel: Lagra ett objekt på en fil MyData dataitem = ; ObjectOutputStream output; try { output = new ObjectOutputStream( new FileOutputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { outputwriteobject(dataitem); catch (IOException e) { Systemoutprintln ( Error writing to file );

class MyData implements Serializable { int a; String name; Exempel: Lagra ett objekt på en fil MyData dataitem = ; ObjectOutputStream output; try { output = new ObjectOutputStream( new FileOutputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { outputwriteobject(dataitem); catch (IOException e) { Systemoutprintln ( Error writing to file );

class MyData implements Serializable { int a; String name; MyData dataitem; ObjectInputStream input; try { Exempel: Läs ett objekt från en fil input = new ObjectInputStream( new FileInputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { dataitem = (MyData)inputreadObject(); catch (ClassNotFoundException e) { Systemoutprintln ( Incorrect object on file ); catch (IOException e) { Systemoutprintln ( Error reading from file );

class MyData implements Serializable { int a; String name; MyData dataitem; ObjectInputStream input; try { Exempel: Läs ett objekt från en fil input = new ObjectInputStream( new FileInputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { dataitem = (MyData)inputreadObject(); catch (ClassNotFoundException e) { Systemoutprintln ( Incorrect object on file ); catch (IOException e) { Systemoutprintln ( Error reading from file );

class MyData implements Serializable { int a; String name; MyData dataitem; ObjectInputStream input; try { Exempel: Läs ett objekt från en fil input = new ObjectInputStream( new FileInputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { dataitem = (MyData)inputreadObject(); catch (ClassNotFoundException e) { Systemoutprintln ( Incorrect object on file ); catch (IOException e) { Systemoutprintln ( Error reading from file );

class MyData implements Serializable { int a; String name; MyData dataitem; ObjectInputStream input; try { Exempel: Läs ett objekt från en fil input = new ObjectInputStream( new FileInputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { dataitem = (MyData)inputreadObject(); catch (ClassNotFoundException e) { Systemoutprintln ( Incorrect object on file ); catch (IOException e) { Systemoutprintln ( Error reading from file );

class MyData implements Serializable { int a; String name; MyData dataitem; ObjectInputStream input; try { Exempel: Läs ett objekt från en fil input = new ObjectInputStream( new FileInputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { dataitem = (MyData)inputreadObject(); catch (ClassNotFoundException e) { Systemoutprintln ( Incorrect object on file ); catch (IOException e) { Systemoutprintln ( Error reading from file );

class MyData implements Serializable { int a; String name; MyData dataitem; ObjectInputStream input; try { Exempel: Läs ett objekt från en fil input = new ObjectInputStream( new FileInputStream( myfile )); catch (IOException e) { Systemoutprintln ( Error opening file ); try { dataitem = (MyData)inputreadObject(); catch (ClassNotFoundException e) { Systemoutprintln ( Incorrect object on file ); catch (IOException e) { Systemoutprintln ( Error reading from file );

Nätverksprogrammering http://downloadoraclecom/javase/tutorial/networking/sockets/ Hur man skickar data mellan datorer via internet

Internet Protokoll: Serie konventioner för hur kommunikation ska gå till IP: Internet Protocol, ett protokoll som används vid internet Vanligast nu är IPv4 Paketorienterat (jfr skicka avgränsade paket) TCP: Transmission Control Protocol, använder sig av IP Förbindelseorieterat (jfr ett telefonsamtal) Sockets: ett programmeringsgränssnitt för att använda TCP Java har olika Socketklasser import javanet*;

IP-adresser

IP-adresser Varje internetansluten dator har en IP-adress

IP-adresser Varje internetansluten dator har en IP-adress Kan jämföras med telefonnummer För att kontakta datorn måste man ange dess IP-adress

IP-adresser Varje internetansluten dator har en IP-adress Kan jämföras med telefonnummer För att kontakta datorn måste man ange dess IP-adress En IP-adress består av 4 bytes separerade av punkt Varje byte är ett tal mellan 0 och 255

IP-adresser Varje internetansluten dator har en IP-adress Kan jämföras med telefonnummer För att kontakta datorn måste man ange dess IP-adress En IP-adress består av 4 bytes separerade av punkt Varje byte är ett tal mellan 0 och 255 Exempel: min IP just nu är 13023811198

IP-adresser Varje internetansluten dator har en IP-adress Kan jämföras med telefonnummer För att kontakta datorn måste man ange dess IP-adress En IP-adress består av 4 bytes separerade av punkt Varje byte är ett tal mellan 0 och 255 Exempel: min IP just nu är 13023811198 IP-adressen ändras när datorn rör sig fysiskt mellan olika nät (till skillnad från tex telefonnummer)

IP-adresser Varje internetansluten dator har en IP-adress Kan jämföras med telefonnummer För att kontakta datorn måste man ange dess IP-adress En IP-adress består av 4 bytes separerade av punkt Varje byte är ett tal mellan 0 och 255 Exempel: min IP just nu är 13023811198 IP-adressen ändras när datorn rör sig fysiskt mellan olika nät (till skillnad från tex telefonnummer) Den speciella adressen localhost leder alltid tillbaka till samma dator Bra när man testar

Vad är min IP? InetAddressgetLocalHost()getHostAddress() Returnerar en String som representerar IPadressen OBS: Den kastar IOException try { title = "I am at IP "+InetAddressgetLocalHost()getHostAddress(); catch (IOException e) { title = "Unable to determine IP";

Portar

Portar Varje dator har 216 = 65536 stycken portar

Portar Varje dator har 216 = 65536 stycken portar Portarna har ingen fysisk motsvarighet Kan anses vara lokala anknytningar inom datorn

Portar Varje dator har 216 = 65536 stycken portar Portarna har ingen fysisk motsvarighet Kan anses vara lokala anknytningar inom datorn Varje tillämpning har en specifik port den kan bli kontaktad på

Portar Varje dator har 216 = 65536 stycken portar Portarna har ingen fysisk motsvarighet Kan anses vara lokala anknytningar inom datorn Varje tillämpning har en specifik port den kan bli kontaktad på För din egen tillämpning: välj ett portnummer Helst inte ett som redan är i bruk Undvik nummer mindre än 1024

Sockets

Sockets Ett sätt att etablera TCP-förbindelse mellan två datorer

Sockets Ett sätt att etablera TCP-förbindelse mellan två datorer Uppkopplingsfasen är asymmetrisk Den ena, Client, kopplar upp aktivt mot ett visst IP och viss port Den andra, Server, lyssnar efter uppkopplingsförsök vid en viss port

Sockets Ett sätt att etablera TCP-förbindelse mellan två datorer Uppkopplingsfasen är asymmetrisk Den ena, Client, kopplar upp aktivt mot ett visst IP och viss port Den andra, Server, lyssnar efter uppkopplingsförsök vid en viss port När förbindelsen väl är igång är situationen symmetrisk: Båda datorerna har en inputstream och en outputstream

Sockets Ett sätt att etablera TCP-förbindelse mellan två datorer Uppkopplingsfasen är asymmetrisk Den ena, Client, kopplar upp aktivt mot ett visst IP och viss port Den andra, Server, lyssnar efter uppkopplingsförsök vid en viss port När förbindelsen väl är igång är situationen symmetrisk: Båda datorerna har en inputstream och en outputstream Jfr telefonsamtal Den ena ringer och den andra blir uppringd, men sedan är samtalet symmetriskt

Klassen Socket Objekt av klassen Socket svarar mot existerande uppkopplingar mot andra datorer De har metoder bla för att ta fram strömmarna och för att stänga sig OutputStream getoutputstream() InputStream getinputstream() För att skicka data, ta fram Outputströmmen och skriv på den Samma för input void close()

Uppkoppling Asymmetrisk Det finns en Client sida och en Server sida Client skapar sin socket genom att helt enkelt använda konstruktorn Socket() Den tar två parametrar: 1 IP-numret att koppla upp sig mot (String) 2 Portnumret för tillämpningen (int) mysocket = new Socket( 13023811198, 12345)

OBS: Kastar IOException om uppkopplingen misslyckades try { mysocket = new Socket( 13023811198, 12345) catch (IOException e) { Systemoutprintln( Could not connect to server )

Servern använder klassen ServerSocket

Servern använder klassen ServerSocket Konstruktorn har en parameter: portnumret den ska betjäna (int)

Servern använder klassen ServerSocket Konstruktorn har en parameter: portnumret den ska betjäna (int) Den skapar ett ServerSocket - objekt

Servern använder klassen ServerSocket Konstruktorn har en parameter: portnumret den ska betjäna (int) Den skapar ett ServerSocket - objekt Detta objekt har en metod accept() som väntar på anslutningar från en client

Servern använder klassen ServerSocket Konstruktorn har en parameter: portnumret den ska betjäna (int) Den skapar ett ServerSocket - objekt Detta objekt har en metod accept() som väntar på anslutningar från en client När en sådan kommer returnerar accept() en Socket

Servern använder klassen ServerSocket Konstruktorn har en parameter: portnumret den ska betjäna (int) Den skapar ett ServerSocket - objekt Detta objekt har en metod accept() som väntar på anslutningar från en client När en sådan kommer returnerar accept() en Socket myserver = new ServerSocket(12345); mysocket = myserveraccept();

Servern använder klassen ServerSocket Konstruktorn har en parameter: portnumret den ska betjäna (int) Den skapar ett ServerSocket - objekt Detta objekt har en metod accept() som väntar på anslutningar från en client När en sådan kommer returnerar accept() en Socket myserver = new ServerSocket(12345); mysocket = myserveraccept(); OBS: detta kastar också IOException och bör omslutas av try-catch

Kommunikation Symmetrisk En förbindelse mellan två datorer använder en socket i vardera datorn, och kan ta fram input och outputströmmar

Kommunikation Symmetrisk En förbindelse mellan två datorer använder en socket i vardera datorn, och kan ta fram input och outputströmmar myinput = mysocketgetinputstream()

Kommunikation Symmetrisk En förbindelse mellan två datorer använder en socket i vardera datorn, och kan ta fram input och outputströmmar myinput = mysocketgetinputstream() myoutput = mysocketgetoutputstream()

Client mysocket = new Socket(ipNumber, port) Server myserver = new ServerSocket(port); mysocket = myserveraccept(); Uppkoppling klar myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() objectoutput = new ObjectOutputStream(myOutput) objectoutput = new ObjectOutputStream(myOutput) objectinput = new ObjectInputStream(myInput) Strömmar klara objectinput = new ObjectInputStream(myInput) objectoutputwriteobject( Hello ) m = (String)objectInputread() m = (String)objectInputread() objectoutputwriteobject( Hi )

Client mysocket = new Socket(ipNumber, port) Server myserver = new ServerSocket(port); mysocket = myserveraccept(); Uppkoppling klar myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() objectoutput = new ObjectOutputStream(myOutput) objectoutput = new ObjectOutputStream(myOutput) objectinput = new ObjectInputStream(myInput) Strömmar klara objectinput = new ObjectInputStream(myInput) objectoutputwriteobject( Hello ) m = (String)objectInputread() m = (String)objectInputread() objectoutputwriteobject( Hi )

Client mysocket = new Socket(ipNumber, port) Server myserver = new ServerSocket(port); mysocket = myserveraccept(); Uppkoppling klar myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() objectoutput = new ObjectOutputStream(myOutput) objectoutput = new ObjectOutputStream(myOutput) objectinput = new ObjectInputStream(myInput) Strömmar klara objectinput = new ObjectInputStream(myInput) objectoutputwriteobject( Hello ) m = (String)objectInputread() m = (String)objectInputread() objectoutputwriteobject( Hi )

Client mysocket = new Socket(ipNumber, port) Server myserver = new ServerSocket(port); mysocket = myserveraccept(); Uppkoppling klar myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() objectoutput = new ObjectOutputStream(myOutput) objectoutput = new ObjectOutputStream(myOutput) objectinput = new ObjectInputStream(myInput) Strömmar klara objectinput = new ObjectInputStream(myInput) objectoutputwriteobject( Hello ) m = (String)objectInputread() m = (String)objectInputread() objectoutputwriteobject( Hi )

Client mysocket = new Socket(ipNumber, port) Server myserver = new ServerSocket(port); mysocket = myserveraccept(); Uppkoppling klar myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() objectoutput = new ObjectOutputStream(myOutput) objectoutput = new ObjectOutputStream(myOutput) objectinput = new ObjectInputStream(myInput) Strömmar klara objectinput = new ObjectInputStream(myInput) objectoutputwriteobject( Hello ) m = (String)objectInputread() m = (String)objectInputread() objectoutputwriteobject( Hi )

Client mysocket = new Socket(ipNumber, port) Server myserver = new ServerSocket(port); mysocket = myserveraccept(); Uppkoppling klar myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() myoutput = mysocketgetoutputstream() myinput = mysocketgetinputstream() objectoutput = new ObjectOutputStream(myOutput) objectoutput = new ObjectOutputStream(myOutput) objectinput = new ObjectInputStream(myInput) Strömmar klara objectinput = new ObjectInputStream(myInput) objectoutputwriteobject( Hello ) m = (String)objectInputread() m = (String)objectInputread() objectoutputwriteobject( Hi )

Superviktigt Allt måste omslutas av en try-catch med ett finally block Finally blocket måste göra close() på alla strömmar och sockets I annat fall kan en port forsätta vara reserverad efter att programmet slutat Om det händer, logga ut och logga in

Exempel En meddelandesändare: Användaren skriver in en ip, ett portnummer och ett meddelande Meddelandesändaren skickar iväg det Demo

Exempel Visades inte på föreläsningen Klassen Sender gör allt jobb public class Main { public static void main(string[] args) { new Sender(); Instansvariabler: sådant som lever mellan metodanrop class Sender { ObjectOutputStream output; Socket socket; String ip; int port; String message;

Konstruktor Visades inte på föreläsningen Tre faser, alla i ett try block Sender () { try { getdata(); getconnection(); sendmessage(); catch (IOException e) { Systemoutprintln("Det misslyckades: "+egetmessage()); finally { close();

Avslut Visades inte på föreläsningen Stäng allt du kan void close() { try { if (socket!= null) socketclose(); if (output!= null) outputclose(); catch (IOException e) { Systemoutprintln("Error in closing");

Avändarinteraktion Använd Swings dialoger Obs att portnumret måste omvandlas till int Visades inte på föreläsningen void getdata () { ip = JOptionPaneshowInputDialog("To what IP?", null); String portstring = JOptionPaneshowInputDialog("To what port?", null); port = IntegerparseInt(portString); message = JOptionPaneshowInputDialog("What message?", null);

Kommunikation Visades inte på föreläsningen void getconnection () throws IOException { socket = new Socket(ip,port); output = new ObjectOutputStream(socketgetOutputStream()); outputflush(); flush() sägs vara bra att göra på ny ström void sendmessage () throws IOException { outputwriteobject(message);