Rozhraní Sockets Java a C (BSD)



Podobné dokumenty
Rozhraní Sockets Java a C (BSD)

Síťové programování. Berkeley sockets Zdroje. Wikipedia Google Jan Kubr

Komunikace v sítích TCP/IP (2)

Úvod Virtuální kanál TCP Datagramová služba UDP URL TCP, UDP, URL. Fakulta elektrotechnická

Úvod Jednoduchá komunikace Sockety Konec. Programování v C# Síťová komunikace. Petr Vaněček 1 / 33

Komunikační sokety. teorie a implementace v C#, C++ a Javě. Aleš Keprt Katedra informatiky UP duben 2006, revize květen 2007

Programování v jazyku Java Java a Internet, základní pojmy, socketové x datagramové spojení, klient - server architektura.

1. Téma 12 - Textové soubory a výjimky

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Jak naprogramovat internetovou komunikaci?

Úvod do po íta ových sítí KIV/UPS. Ing. Petr V elák 16. prosince 2008

Sít ová komunikace v C++

Fakulta elektrotechniky a informatiky Vysoká škola báňská - Technická univerzita Ostrava. Cvičení 5 POČÍTAČOVÁ OBRANA A ÚTOK - POU

Protokoly: IP, ARP, RARP, ICMP, IGMP, OSPF

Soubor jako posloupnost bytů

Regulární výrazy. Vzory

RMI Remote Method Invocation

Počítačové sítě II. 14. Transportní vrstva: TCP a UDP. Miroslav Spousta, 2005

Se vznikem internetu se můžeme na síťovou komunikaci v Javě (komunikace mezi více JVM) dívat dvěma pohledy-způsoby:

Algoritmizace a programování

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Část 1 Příklad GUI aplikace Simulátor/Plátno. GUI s plátnem Struktura aplikace Struktura simulátoru Struktura grafického rozhraní Praktické ukázky

Programování v Javě I. Leden 2008

Programování v Javě I. Únor 2009

Abstraktní datové typy: zásobník

Textové soubory. alg9 1

Počítačové sítě Transportní vrstva. Transportní vrstva

Transportní vrstva. RNDr. Ing. Vladimir Smotlacha, Ph.D.

Vytváření a použití knihoven tříd

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Analýza aplikačních protokolů

TFTP Trivial File Transfer Protocol

Téma 11. ICMP, IPv6 Transportní vrstva

6. Transportní vrstva

Identifikátor materiálu: ICT-3-03

Téma 10 SíťovéIP protokoly a API

Téma 10 SíťovéIP protokoly a API

Síťování (informativní)

Počítačové sítě Systém pro přenos souborů protokol FTP

C++ a vnější svět. David Bednárek Jakub Yaghob Filip Zavoral

Soketové připojení Klient InetAddress getbyname() UnknowHostException SecurityException Socket getinputstream() getoutputstream() IOException Server

Datové struktury. alg12 1

InputStream. FilterInputStream

Úvod do programování - Java. Cvičení č.4

Ošetřování chyb v programech

Síťování (informativní)

Síťování (informativní) Síťování (informativní) Zdroje. Co je síťování? Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Distribuované systémy a výpočty

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

PLATFORMÁCH FAKULTA INFORMAČNÍCH TECHNOLOGIÍ MARTIN VACH BRNO UNIVERSITY OF TECHNOLOGY

8. přednáška: Soubory a proudy

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Principy objektově orientovaného programování

Práce se soubory v Javě

PREPROCESOR POKRAČOVÁNÍ

Komunikační protokol snímače rel. vlhkosti SV-xxx-x

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Vlastnosti podporované transportním protokolem TCP:

Seminář Java II p.1/43

UPS MONITOR Zařízení pro monitorování záložních zdrojů s protokolem Smart UPS APC

Hypertext Transfer Protocol (HTTP/1.1 RFC 2616) Počítačové sítě Pavel Šinták

Java Výjimky Java, zimní semestr

Operační systémy a databáze. Téma 13. Počítačové sítě

Implementace aplikační vrstvy pro jednočipové mikrokontroléry

Teoretické minimum z PJV

Generické programování

Výjimky. v C# a Javě

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

CCNA I. 3. Connecting to the Network. CCNA I.: 3. Connecting to the network

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

KTE / ZPE Informační technologie

7. Datové typy v Javě

Úvod do programovacích jazyků (Java)

TDP RPort 1.0. uživatelská příručka. 12. července 2007 Na slupi 2a, Praha 2

Komunikační protokol

Analýza protokolů rodiny TCP/IP, NAT

Řídicí modul pro systém na monitorování polohy mobilních objektů

6. PRÁCE S DATOVÝMI PROUDY

Y36SPS Jmenné služby DHCP a DNS

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

TÉMATICKÝ OKRUH Počítače, sítě a operační systémy

Java a XML. 10/26/09 1/7 Java a XML

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Model ISO - OSI. 5 až 7 - uživatelská část, 1 až 3 - síťová část

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Vláknové programování část V

Počítačové sítě - program cvičení

3.17 Využívané síťové protokoly

7. Aplikační vrstva. Aplikační vrstva. Počítačové sítě I. 1 (5) KST/IPS1. Studijní cíl. Představíme si funkci aplikační vrstvy a jednotlivé protokoly.

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

OBSAH. 1. Úvod Požadavky na SW vybavení... 3

IMPLEMENTACE INFORMAČNÍHO SYSTÉMU VIDIUM V JAZYCE JAVA

Transkript:

Rozhraní Sockets Java a C (BSD) Počítačové sítě 3. cvičení

Seznámení s Virtlabem

Aktivní úlohy odkazy na konzoly rezervovaných zařízení Pozor na kvóty Používat záznam, zálohovat si konfiguraci před ukončením Práce s Virtlabem virtlab.cs.vsb.cz login/heslo z LDAP Rezervace úlohy Vybíráte si topologii, čas,... Lze přidat kolegy k rezervované úloze

Pozor! Applet má problémy s x64, na řešení se pracuje Firefox potřebuje ukončit spojení (Soubor Odpojit v menu appletu) před zavřením záložky. Pokud je použit ABP/Adblock, je třeba přidat na seznam serverů, kde ABP není používán virtlab.cs.vsb.cz IE7 posílá <TAB> i do hlavního okna Práce v terminálu Virtlabu Applet poskytuje terminál na aktivní prvky a PC

Úvodní informace BSD Sockety práce se síťovým spojením jako se soubory (POSIX) Protokoly rodiny IP TCP a UDP, identifikace IP adresou a číslem portu TCP (Transmission Control Protocol) - spolehlivý logický kanál. Před samotnou komunikací se naváže spojení, veškerá odeslaná data jsou druhou stranou potvrzována, na konci je nutno spojení ukončit (uzavřít). UDP (User Datagram Protocol) - Nedochází k navázání spojení, data jsou odeslána na stanovenou IP adresu a daný UDP port a nevíme, zda data dorazila, zda nešlo k jejich zdvojenému doručení (není-li vyplněn kontrolní součet, nevíme zda v pořádku).

Schéma práce se sockety TCP socket bind listen connect klient server accept DATA close Data: send/recv, read/write

Schéma práce se sockety UDP socket socket bind bind connect DATA close close Data: sendto/recvfrom Data: send/recv, read/write

Potřebné knihovny V Javě jsou potřebné třídy v Java.net Sockety java.io Vyjímky, streamy V C/C++ je zapotřebí připojit tyto hlavičky: netdb.h arpa/inet.h sys/time.h sys/socket.h netinet/in.h

Vytvoření socketu K vytvoření socketu v Javě slouží new Socket([adresa, c_port]) new ServerSocket(z_port [, bl]) new DatagramSocket([z_port]) UDP new MulticastSocket([z_port]) UDP multicasty K vytvoření socketu v C/C++ slouží funkce int socket(int domain, int type, int protocol) domain určuje způsob komunikace (PF_INET: IP) type je typ socketu SOCK_STREAM: TCP SOCK_DGRAM: UDP protocol není v našem případě třeba využit a je tudíž 0.

Pojmenování socketu Je-li v Javě nutno specifikovat přesný port, lze použít public void bind(socketaddress bindpoint) V C/C++ slouží k pojmenování socketu funkce int bind(int sck, struct sockaddr* name, int namelen) sck deskriptor socketu (z funkce socket) name struktura sockaddr_in s IP adresou socketu a číslem portu sin_family AF_INET protokol IPv4 sin_addr.s_addr IP adresa (INADDR_ANY) sin_port port na počítači (do 1024 rezervováno pro roota) namelen velikost struktury sizeof(sockaddr_in))

Připojení klienta V Javě lze zadat adresu v konstruktoru (TCP), nebo void connect(socketaddress endpoint) Pro UDP lze použít třídy DatagramPacket a metod send a receive třídy DatagramSocket V C/C++ slouží k připojení k serveru funkce int connect(int sck, struct sockaddr* name, int namelen) name jako u bind(), ale jde o cílovou adresu. V případě UDP není connect nutný, jsou-li používány funkce sendto a recvfrom

Provoz serveru V Javě existují metody bind (odpovídá bind+listen) a accept ve třídě ServerSocket Uvedeme č. portu a max počet požadavků, čekajících ve frontě (backlog) v konstruktoru nebo void bind(socketaddress endpoint, int backlog) Metoda void accept() - otevření příchozího socketu V C/C++ slouží k naslouchání na socketu funkce int listen(int sck, int backlog) backlog max počet požadavků, čekajících ve frontě int accept (int sck, struct sockaddr* addr, int* addrlen) Zablokuje se do přijetí požadavku, do addr je uložena IP adresa klienta (často po accept následuje int fork())

Zasílání dat V Javě využíváme reader/writer vytvořený nad streamy z getinputstream(), getoutputstream() nebo třídy DatagramPacket C/C++ nabízí několik způsobů zasílání dat POSIXové souborové funkce read/write int read(int sck, char* buf, unsigned buflen) int write(int sck, char* buf, unsigned buflen) Fukce send/recv int send(int sck, char* buf,int buflen, int flags) int recv(int sck, char* buf,int buflen, int flags) flags mohou dále specifikovat data (urgentní, ) Funkce sendto/recvfrom pro datagramy bez connect int sendto(<jako send>, struct sockaddr* to, int tolen) int recvfrom(<jako recv>, struct sockaddr* from, int *fromlen)

Ukončení spojení V Javě lze slouží k ukončení spojení metoda void close() Na Socketu resp. na Input/Output streamu V C/C++ slouží k ukončení spojení funkce int close(int sck) klasické uzavření spojení int shutdown(int sck, int how) how = 0 uzavřít pro příjem how = 1 uzavřít pro vysílání how = 2 reset spojení

Nastavení parametrů socketu Nastavování v Javě pomocí metod get/set tříd *Socket (např. setsotimeout) Nastavování v C/C++ Funkce pro sockety int getsockopt(int sck, int lvl, int optname, char* optval, int* optlen) int setsockopt(int sck, int lvl, int optname, char* optval, int optlen) lvl: SOL_SOCKET, IPPROTO_TCP, Funkce pro práci se soubory (fcntl.h, unistd.h) int fcntl(int sck, int cmd, long arg) Funkce pro práci s V/V zařízeními (sys/ioctl.h) int ioctl(int d, int request,...)

Poznámky k Javě Non-blocking sockety nelze přímo použít, ale na Socketu lze volat metodu setsotimeout(milisekund) Pokud blokující operace (čtení, zápis) neskončí včas výjimka java.net.sockettimeoutexception Socket není zneplatněn, může následovat nový pokus o provedení operace po ošetření výjimky Převod doménového jména na InetAddress InetAddress ia=inetaddress.getbyname(jméno) ia.gethostaddress() vrací IP adresu jako řetězec

Non-blocking sockety v C/C++ Pokud nemůžeme v programu čekat na příchod dat: int flag=0; flag=fcntl(sck, F_GETFL, 0); if(flag == -1) { flag = 0; } fcntl(sck, F_SETFL, flag O_NONBLOCK); Staré systémy nemající O_NONBLOCK: int flag=1; ioctl(sck, FIOBIO, &flag); Blokující funkce pak vracejí místo zablokování -1 errno nastaveno na EWOULDBLOCK

Řešení timeoutu v C #include <unistd.h> #include <signal.h> #define MAX_REP 10 int repeat=0; void alarmed(int signo) { //Max. počet retransmisí //Aktuální počet retransmisí if (++repeat > MAX_REP) { //Překročeno MAX_REP //Informovat, že vysílání selhalo signal(sigalrm, NULL); exit(-1); //Ukončit } else { //Provést retransmise alarm(1); //Znovu nastavit timeout } } //Odeslat data (1. pokus) alarm(1); signal(sigalrm,alarmed); //Nastavit timeout // Příjem potvrzení (pokud nepřijde během 1s, bude vyvolán SIGALRM) repeat=0; alarm(0); //Zrušit timeout

Pomocné funkce v C Převody mezi formáty reprezentací htonl, htons převádí endian z PC síť (long, short) ntohl, ntohs převádí endian z síť PC (long, short) unsigned long inet_addr(char* cp) převod z tečkové notace char* inet_ntoa(struct in_addr in) převod do tečkové notace Práce s doménovými jmény int gethostname(char* name, int namelen) název lokální stanice struct hostent* gethostbyname(char* name) adresa stanice je v char * he->h_addr struct hostent* gethostbyaddr(char* addr, int len, int type) doménové jméno stanice z IP adresy char* he->h_name

Ukázka příkladů Detailní popis a příklady (na konci textu) C/C++ http://www.cs.vsb.cz/grygarek/ps/sockets.html Java http://www.cs.vsb.cz/grygarek/ps/dosys/inprise/net/examples Ex1 TCP Ex2 UDP Ex3 multicasty Ex4 získání dat pomocí URL(třída URLConnection)

Java připojení přes TCP Socket try { s=new Socket(host,port); BufferedReader sis = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter os = new BufferedWriter( new OutputStreamWriter(s.getOutputStream())); BufferedReader is = new BufferedReader( new InputStreamReader(s.getInputStream())); String l; do { System.out.println("Type a line to send to server."); l=sis.readline(); os.write(l); os.newline(); os.flush(); System.out.println("Server: " + is.readline()); } while (!l.equals("exit") &&!l.equals("down")); s.close(); } catch (IOException e) { System.out.println(e); }

Java TCP Server try { ServerSocket s=new ServerSocket(port); Socket cs; do { cs=s.accept(); BufferedReader is = new BufferedReader (new InputStreamReader(cs.getInputStream())); BufferedWriter os = new BufferedWriter (new OutputStreamWriter(cs.getOutputStream())); do { msg=is.readline(); os.write(string.valueof(msg.length())); os.newline(); os.flush(); } while (!msg.equals("exit") &&!msg.equals("down")); cs.close(); } while (!msg.equals("down")); s.close(); } catch (IOException e) { System.out.println(e); }

Java MultiThreading TCP Server Vylepšuje předchozí příklad pomocí vláken, můžeme zpracovat více požadavků zároveň public class MyApplication implements Runnable { protected Socket cs; static ServerSocket s; static int port=8000; public static void main(string[] args) { Socket cs; try { s=new ServerSocket(port); do {cs=s.accept(); new Thread(new MyApplication(cs)).start(); } while (true); } catch (IOException e) {if(!e instanceof SocketException){System.out.println(e);}} } public MyApplication(Socket cs) {this.cs=cs;} public void run() { /* Zde patří fialový text z předchozího slide */ if (msg.equals("down")) s.close(); // Uzavře server socket a ukončí aplikaci } }

Java UDP Client String data; //Data získáme později, např. čtením ze System.in int port=8000; String server="www.cs.vsb.cz"; try { DatagramSocket s=new DatagramSocket(); DatagramPacket p = new DatagramPacket(data.getBytes(), data.length(), InetAddress.getByName(server), port); s.send(p); s.receive(p); reply=new String(p.getData(),0,p.getLength()); System.out.println("Reply arrived from "+ p.getaddress() +" : "+ p.getport()+ " > " + reply); s.close(); } catch (IOException e) { System.out.println(e); }

Java UDP Server Pro datagramové servery není samostatná třída, není ji potřeba try { DatagramSocket s=new DatagramSocket(port); DatagramPacket p; String msg; do { p=new DatagramPacket(new byte[512], 512); // ^ vzhledem k fixní velikosti bufferu pokaždé alokujeme znovu s.receive(p); msg = new String(p.getData(),0,p.getLength()); System.out.println("Datagram from " + p.getaddress() + " : " + p.getport() + " > " + m p.setdata(msg.touppercase().getbytes()); p.setlength(msg.length()); s.send(p); } while (!msg.equals("down")); s.close(); } catch (IOException e) { System.out.println(e); }

Úloha hromadný chat Poslání zprávy na talk server přes TCP/ 8000 Příjem zpráv z UDP/8010 broadcastu Zpráva max. 255 ASCII znaků ukončeno <LF> (tj. \n) Při posílání UDP zpět je zprávě předřazen 1 byte, který určuje její délku (0-255).