Lạp trình Socket

41 508 1
Lạp trình Socket

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Trang 164 Chng 8: LP TRÌNH SOCKET I. Các kin thc liên quan Trc khi bt u hc bài này các bn cn c li các kin thc liên quan sau: - Giao thc, yêu cu ti thiu các bn phi nm c 3 giao thc : IP, TPC, UDP - Cách ánh a ch IP, a ch dng tên min, giao thc chuyn i a ch IP thành a ch tên min, và ngc li - Mt sa chc bit: a ch lp, a ch broadcash, multicash… - Cng giao thc - Phân bit c s khác nhau, ging nhau gia 2 giao thc TCP và UDP 1. Gii thiu Socket Socket là mt giao din lp trình ng (API - Application Program Interface) dng ng, thông qua giao din này ta có th lp trình u khin vic truyn thông gia 2 máy  dng các giao thc mc thp nh TCP, UDP…, Socket là mt s tru tng hoá  mc cao, có th tng tng, nó nh là mt thit b truyn thông 2 chiu tng t nh tp tin, chúng ta gi/ nhn d liu gia 2 máy, tng t nh vic c/ ghi trên tp tin.  liên lc thông qua Socket, ta cn tin hành các thao tác: - To lp hay m mt Socket + Gn mt Socket vi mt a ch, a ch này chính là a ch ca máy mà nó cn liên lc + Thc hin vic liên lc, có 2 kiu liên lc tu thuc vào ch kt ni: a) Liên lc trong ch không kt ni: Hai tin trình liên lc vi nhau không kt ni trc tip i thông p gi i phi kèm theo a ch ca ngi nhn Hình thc liên lc này có c m: ngi gi không chc chn thông p ca h có n tay ngi nhn không t thông p có th gi nhiu ln thông p gi sau có thn ích trc thông p gi trc ó b) Liên lc trong ch kt ni: Có mt ng kt ni “o” c thành lp gia 2 tin trình, trc khi mt kt ni c thành lp thì mt trong 2 tin trình phi i tin trình kia yêu cu kt ni, có th s dng Socket  liên lc theo mô hình Client/Server. Trong mô hình này server s dng li gi listen và accept lng nghe và chp nhn mt yêu cu kt ni 2. Lp trình Socket trong java Java cung cp mt s lp cho phép các ng dng mng có th trao i vi nhau qua  ch Socket, c th lp Socket cung cp cho ta c ch liên lc trong ch kt ni (s ng giao thc TCP) và lp DatagramSocket cho phép các ng dng mng liên lc vi nhau trong ch không kt ni (s dng giao thc UDP), tt c các lp liên quan n vic p trình Socket c java nhóm li và  trong gói java.net II. Kho sát mt s lp trong gói java.net 1. Lp InetAddress i mt máy khi tham gia truyn thông cn phi có mt nh danh, nh danh này phi là duy nht, nh danh này c th hin bng a ch IP hoc a ch di dng Trang 165 tên min. Lp InetAddress biu th cho mt a ch ca mt máy nào ó, khi ta mun liên lc vi mt máy  xa, ta phi bit c a ch IP ca máy  xa, tuy nhiên a ch IP thì rt khó nh, ôi khi ta không th bit chính xác a ch IP ca máy ó, bi vì nhiu nguyên nhân khác nhau nh: máy ó khi ng t xa hoc c ni vào nhà cung cp dch v Internet, do vy mi ln kt ni vào nhà cung cp dch v ISP ta li có 1 a ch IP khác nhau. Vy th thì làm th nào  ta có th liên lc vi máy  xa khi ta ch bit a ch máy ó di dng tên min?, câu tr li là lp InetAddress ã làm u ó cho ta, lp này tng chuyn a ch dng tên min thành a ch IP và ngc li. p InetAddress cung cp mt s phng thc tnh (static) dùng  chuyn i da ch i dng tên min thành a ch IP và ngc li. Có mt s phng thc sau mà bn cn quan tâm: Phng pháp Mô t Public void equals( Object obj) So sánh 2 i tng Public byte[] getAddress() y va ch IP di dng mng byte public static InetAddress[] getAllByName(String host) throws UnknownHostException Tr v mng i tng InetAddress, vì mt máy có th có nhiu a ch IP (do có nhiu card ng), nên phng thc này tr v mt mng cha tt c các a ch tng ng vi tên min. public static InetAddress getByName(String host) throws UnknownHostException Tr li i tng InetAddress có tên c ch ra, tên này là mt xâu kí t di dng tên min hoc a ch IP public String getHostAddress() Tr va ch IP ca máy ch public String getHostName() Tr v tên ca máy ch public static InetAddress getLocalHost() throws UnknownHostException Tr vi tng InetAddress kt hp vi chính máy ó public boolean isMulticastAddress() Kim tra xem a ch này có phi là a ch Multicast không Chú ý: Trong gói java.net còn lp Inet4Address và lp Inet6Address hai lp này th hin cho các a ch IP version 4 và IP version 6, nó gm tt c các thành phn ca lp InetAddress Ta cn thêm mnh  import p java.net.InetAddress trc khi có th s dng nó. Trang 166 Phng thc getByName s có gng phân gii tên min thành a ch IP tng ng bng cách: Trc tiên nó i tìm trong cache, nu không tìm thy nó tìm tip trong tp host, u vn không tìm thy nó s c gng kt ni n máy ch DNS  yêu cu phân gii tên này thành a ch IP, nu không th phân gii c tên này thì nó s sinh ra mt ngoi l UnknownHostException, th nên bn cn t chúng vào mt khi try catch. Ví d 1: Minh ho cách s dng các phng thc getByName  to ra mt InetAddress import java.net.*; class InetAddress1 { public static void main(String[] args) { try { InetAddress address = InetAddress.getByName("www.theht.edu.vn"); System.out.println(address); } catch (UnknownHostException ex) { System.out.println("Could not find www.theht.edu.vn"); } } } t qu chy chng trình nh sau: www.theht.edu.vn/127.0.0.1Ngoài cách truyn vào phng thc getByName mt xâu ký t th hin tên máy bn ta th truyn vào mt xâu th hin a ch IP ca máy nh sau: InetAddress address = InetAddress.getByName("192.168.101.1"); Ví d 2: To ra mt InetAddress tng ng vi máy cc b: import java.net.*; class MyAddress { public static void main(String[] args) { try { InetAddress address = InetAddress.getLocalHost(); System.out.println(address); } catch (UnknownHostException ex) { System.out.println("Could not find this computer's address."); } } } t qu chy chng trình nh sau: Trang 167 theht1/192.168.101.1Ví d 3: Nu máy bn có cài nhiu card mng bn có th ly v mt ng các InetAddess tng ng vi a ch IP cho tng card mng ó: import java.net.*; class AllAddressesOfTheht { public static void main(String[] args) { try { InetAddress[] addresses = InetAddress.getAllByName("www.theht.edu.vn"); for (int i = 0; i < addresses.length; i++) { System.out.println(addresses[i]); } } catch (UnknownHostException ex) { System.out.println("Could not find www.theht.edu.vn"); } } } t qu chy chng trình nh sau: www.theht.edu.vn /192.168.101.1www.theht.edu.vn /10.0.0.2www.theht.edu.vn /162.163.10.5www.theht.edu.vn /3.152.90.25s d cho kt qu nh trên là do máy ca tôi có cài 4 card mng, tng ng vi mi card mng tôi t mt da ch IP cho nó. u máy ca bn có ni mng Internet bn có th kim tra xem máy ch www.microsoft.com ca Microsoft c cài bao nhiêu b giao tip mng bng cách thayInetAddress.getAllByName("www.theht.edu.vn"); bi InetAddress.getAllByName("www.microsoft.com"); Ví d 4: y v tên máy khi bit a ch IP ca nó,  ly v tên ca máy ta s dng phng thc getHostName nh sau: import java.net.*; class ReverseTest { public static void main(String[] args) { try { InetAddress ia = InetAddress.getByName("162.163.10.5"); System.out.println(ia.getHostName()); } catch (Exception ex) { System.err.println(ex); } } } Trang 168 t qu ra nh sau: theht Ví d 5: Ly v ch IP ca máy khi bit tên ca máy,  ly va ch IP ca máy ta s ng phng thc getHostAddress nh sau: import java.net.*; class GetHostAddress { public static void main(String[] args) { try { InetAddress me = InetAddress.getLocalHost(); String dottedQuad = me.getHostAddress(); System.out.println("My address is " + dottedQuad); } catch (UnknownHostException ex) { System.out.println("I'm sorry. I don't know my own address."); } } } t qu in ra nh sau: My address is 192.168.101.1Ta có th ly va ch IP tng ng vi mt tên min bt k không nht thit là máy cc b nh trên, chng hn bn có th ly v ch IP ca máy www.theht.edu.vn hoc www.microsoft.com nh sau: import java.net.*; class GetHostAddress1 { public static void main(String[] args) { try { InetAddress me = InetAddress.getByName("www.theht.edu.vn"); String dottedQuad = me.getHostAddress(); System.out.println("Address is " + dottedQuad); } catch (UnknownHostException ex) { System.out.println("I'm sorry. I don't know my own address."); } } } t qu in ra nh sau: Address is 192.168.101.1 Trang 169 Ví d 6: Kim tra xem hai a ch tên min có cùng mt a ch IP hay không.  kim tra u này ta s dng phn thc equals nh sau: import java.net.*; class Equal { public static void main(String args[]) { try { InetAddress add1 = InetAddress.getByName("www.theht.edu.vn"); InetAddress add2 = InetAddress.getByName("www.theht.com.vn"); if (add1.equals(add2)) { System.out.println("Hai dia chi nay co cung IP"); } else { System.out.println("Hai dia chi nay khac IP"); } } catch (UnknownHostException ex) { System.out.println("Khong the tim thay host."); } } } t qu cho nh sau: Hai dia chi nay khac nhau Ví d 7: Xây dng chng trìn HostLookup tng t nh chng trình NSLookup ca Windows, chng trình này có nhim v khi bn gõ vào a ch IP thì nó s tr va ch tên min và ngc lai: import java.net.*; import java.io.*; public class HostLookup { public static void main(String[] args) { if (args.length > 0) { // Su dung tham so dong lenh for (int i = 0; i < args.length; i++) { System.out.println(lookup(args[i])); } } else { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); Trang 170 System.out.println( "Enter names and IP addresses.Enter \"exit\" or \"quit\" to quit."); try { while (true) { String host = in.readLine(); if (host.equalsIgnoreCase("exit") || host.equalsIgnoreCase("quit")) { break; } System.out.println(lookup(host)); } } catch (IOException ex) { System.err.println(ex); } } } private static String lookup(String host) { InetAddress node; try { node = InetAddress.getByName(host); } catch (UnknownHostException ex) { return "Cannot find host " + host; } if (isHostname(host)) { //Dia chi nay duoi dang ten mien return node.getHostAddress(); } else { // Dia chi nay duoi dang IP return node.getHostName(); } } //Hàm kim tra xem a ch host di dng tên min hay a ch IP private static boolean isHostname(String host) { char[] ca = host.toCharArray(); for (int i = 0; i < ca.length; i++) { Trang 171 if (!Character.isDigit(ca[i])) { if (ca[i] != '.')return true; } } return false; } } 2. Lp URL và URI Lp URL là mt lp rt n gin giúp bn trong vic nh v và ly v d liu t ng, mà bn không cn phi quan tâm n giao thc c s dng, nh dng ca d liu hoc không cn quan tâm n cách giao tip vi máy ch. o ra mt URL Không ging nhi tng InetAddress bn có th s dng hàm to ca lp URL  to ra t i tng URL mi. Có sáu hàm to khác nhau ca lp URL cho phép bn to ra các URL vi các yêu cu khác nhau. Tt c các hàm to này u ném ra ngoi l MalformedURLException nu bn to ra mt URL t mt giao thc không c h tr hoc các thông tin cung cp trong URL không chính xác thì bn s nhn c mt ngoi l MalformedURLException a) To ra mt URL t mt xâu public URL(String url) throws MalformedURLException Ging nh các hàm to khác bn ch cn dùng toán t new và cng ging các hàm to khác a lp nó ném ra ngoi l MalformedURLException. Ví d 1: To ra mt URL t mt xâu và bt ngoi l sinh ra try { URL u = new URL("http://www.utehy.edu.vn/"); } catch (MalformedURLException ex) { System.err.println(ex); } Ví d 2: Ví d này to ra mt s URL và kim tra xem giao thc tng ng vi các URL có c h tr trong virtual machine ca bn hay không /* Which protocols does a virtual machine support? */ import java.net.*; class ProtocolTester { public static void main(String[] args) { testProtocol("http://www.adc.org"); // hypertext transfer protocol testProtocol("https://www.amazon.com/exec/obidos/order2/"); // secure http // file transfer protocol testProtocol("ftp://metalab.unc.edu/pub/languages/java/javafaq/"); testProtocol("mailto:elharo@metalab.unc.edu"); // Simple Mail Transfer Protocol testProtocol("telnet://dibner.poly.edu/"); // telnet testProtocol("file:///etc/passwd"); // local file access testProtocol("gopher://gopher.anc.org.za/"); // gopher testProtocol( // Lightweight Directory Access Protocol Trang 172 "ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US?postalAddress"); testProtocol( // JAR "jar:http://cafeaulait.org/books/javaio/ioexamples/javaio.jar!" + "/com/macfaq/io/StreamCopier.class"); testProtocol("nfs://utopia.poly.edu/usr/tmp/"); // NFS, Network File System testProtocol("jdbc:mysql://luna.metalab.unc.edu:3306/NEWS"); // a custom protocol for JDBC // rmi, a custom protocol for remote method invocation testProtocol("rmi://metalab.unc.edu/RenderEngine"); testProtocol("doc:/UsersGuide/release.html"); // custom protocols for HotJava testProtocol("netdoc:/UsersGuide/release.html"); testProtocol("systemresource://www.adc.org/+/index.html"); testProtocol("verbatim:http://www.adc.org/"); } private static void testProtocol(String url) { try { URL u = new URL(url); System.out.println(u.getProtocol() + " is supported"); } catch (MalformedURLException ex) { String protocol = url.substring(0, url.indexOf(':')); System.out.println(protocol + " is not supported"); } } } t qu chy trên máy ca tôi nh sau: http is supported https is supported ftp is supported mailto is supported b) To ra mt URL t các phn riêng l Hàm to này cho gm ba phn riêng bit, chúng cho bit: Giao thc, tên máy ch, p tin mà URL này s dng. public URL(String protocol, String hostname, String file) throws MalformedURLException Hàm to này s tng t port là giá tr mc nh, tu theo giao thc mà bn ch nh nó s s dng mà giá tr mc nh này là khác nhau: Ví d nh : http thì port=80, ftp=23 . Ví d: try { URL u = new URL("http", "www.microsoft.com", "/index.html"); } catch (MalformedURLException ex) { // All VMs should recognize http } n chng trình trên to ra mt URL chn http://www.microsoft.com/index.html, ng mc nh là 80 Trang 173   to ra mt URL vi mt cng chnh bn s dng hàm to sau: public URL(String protocol, String host, int port, String file) throws MalformedURLException Ví d: To ra mt URL gán vi máy localhost trên cng 8080 try { URL u = new URL("http", "localhost", 8080, "/index.html"); } catch (MalformedURLException ex) { System.err.println(ex); } Ví d này to ra mt URL trn http://localhost: 8080/index.html c) To ra mt URL t mt URL khác Hàm to này cho phép bn to ra mt URL t mt URL khác, cú pháp nh sau: public URL(URL base, String relative) throws MalformedURLException Ví d: try { URL u1 = new URL("http://www.ibiblio.org/javafaq/index.html"); URL u2 = new URL (u1, "mailinglists.html"); } catch (MalformedURLException ex) { System.err.println(ex); } Trong ví d này thì u1 ang trn http://www.ibiblio.org/javafaq/index.html còn u2 thì ang trn http://www.ibiblio.org/javafaq/ mailinglists.html. t vài phng thc ca lp URL - public String getHost( ) tr v tên ca máy ch - public int getPort( ) tr v cng c s dng - public int getDefaultPort( ) tr v cng mc nh ca giao thc c s dng. Ví d nh : http=80, email=25, ftp=23 . - public String getFile( ) tr v tên tp tin - public String getPath( ) // Java 1.3 tr vng dn n file, ng dn này thng là t query string. - public String getRef( ), trong ví d sau thì getRef s tr v xtocid1902914 URL u = new URL( "http://www.ibiblio.org/javafaq/javafaq.html#xtocid1902914"); System.out.println("The fragment ID of " + u + " is " + u.getRef( )); - public String getQuery( ) // Java 1.3 tr v mt query string trong URL Ví d: Trong ví d này thì getQuery s tr v category=Piano URL u = new URL( "http://www.ibiblio.org/nywc/compositions.phtml?category=Piano"); System.out.println("The query string of " + u + " is " + u.getQuery( )); - public String getUserInfo( ) // Java 1.3 tr v user name - public String getAuthority( ) // Java 1.3 [...]... n c n t m t s thu c tính cho ServerSocket tr c khi nó th c s ch p nh n các k t n i Thông th ng b n s d ng m u sau: //T o ra m t ServerSocket ch a th c s liên k t v i m t c ng nào ó ServerSocket ss = new ServerSocket( ); // Thi t t m t s thu c tính cho Socket //T o ra m t i t ng SocketAddress liên k t SocketAddress http = new InetSocketAddress(80); //Liên k t ServerSocket v i c ng 80 ss.bind(http);... main(String[] args) { try { Socket theSocket = new Socket( "www.theht.edu.vn", 80); System.out.println("Connected to " + theSocket.getInetAddress() + " on port " + theSocket.getPort() + " from port " + theSocket.getLocalPort() + " of " + theSocket.getLocalAddress()); } // end try catch (UnknownHostException ex) { System.err.println("I can't find host"); } Trang 179 it ng catch (SocketException ex) { System.err.println("Could... InetAddress.getByName("www.theht.edu.vn"); Socket socket = new Socket( http, 80, inward, 0); // work with the sockets } catch (UnknownHostException ex) { System.err.println(ex); } catch (IOException ex) { System.err.println(ex); } 3.2 L y v thông tin g n v i Socket - Ph ng th c public InetAddress getInetAddress( ) dùng l y v i t ng InetAddress ng ng v i máy remote try { Socket theSocket = new Socket( "java.sun.com", 80);... ti n trình, tr c khi m t k t n i c thành l p thì m t trong 2 ti n trình ph i i ti n trình kia yêu c u k t n i Trong mô hình này server ph i l ng nghe và ch p nh n m t yêu c u k t i n t Client Trang 185 vi t các ch ng trình liên l c v i nhau trong ch k t n i ta c n ph i vi t 2 ch ng trình: m t cho server, m t cho client, ch ng trình server có nhi m v l ng nghe và ph n h i k t n i m i, còn ch ng trình. .. l p DatagramPacket cho cung c p cho ta công c óng gói d li u UDP, i t ng DatagramSocket g i i ho c nh n v Ta gi i thích thông qua ch ng trình chat, ch ng trình g m có 2 ch ng trình, hai ch ng trình này là ngang hàng không có ch ng trình nào là ch c , các l nh c n thi t liên l c c trong ch không k t n i c in m Mã ch ng trình th nh t: package net.theht; import javax.swing.*; import java.awt.event.*;... ng minh óng Socket l i Khi g i n ph ng th c close java s t ng óng hai lu n nh p xu t g n v i nó Vi c óng Socket l i s gi i phóng m t s tài nguyên c a h th ng public void close( ) throws IOException M t Socket s t ng óng l i n u x y ra m t trong các tính hu ng sau: - C hai lu ng nh p xu t g n v i Socket u c óng l i - Khi ch ng trình k t thúc - Ho c khi b thu rác c a java c ti n hành Tuy các Socket c ng... {} } 4 L p ServerSocket p này ch dùng cho phía máy ch Nó th ng c s d ng l ng nghe m t k t n i n 4.1 M t s hàm t o c a l p ServerSocket: public ServerSocket(int port) throws BindException, IOException public ServerSocket(int port, int queueLength) throws BindException, IOException public ServerSocket(int port, int queueLength, InetAddress bindAddress) throws IOException public ServerSocket( ) throws... I got a sun.awt.image.URLImageSource URL 3 L p Socket L p này c dùng cho c máy ch và máy khách i v i máy khách nó th ng dùng t n i n máy ch , còn i v i máy ch nó th ng dùng áp l i k t n i t máy khách Thông th ng ta t o ra m t Socket b ng cách s d ng hàm t o c a l p Socket Sau ây là t s hàm t o c a l p Socket 3.1 M t s hàm t o c a l p Socket a) public Socket( String host, int port) throws UnknownHostException,... ng trình trên máy khách //Client.java import java.net.*; import java.io.*; class Client { public static void main(String[] args) throws IOException { Socket sk = new Socket( ); Trang 184 SocketAddress sv = new InetSocketAddress("theht1", 3456); sk.connect(sv); InputStream in = sk.getInputStream(); int c; do { c = in.read(); if (c == -1)break; System.out.print( (char) c); } while (true); } } i ch ng trình. .. nào ó Th nên ki m tra xem ServerSocket có ang m hay không ta ph i làm nh sau: public static boolean isOpen(ServerSocket ss) { return ss.isBound( ) && ! ss.isClosed( ); } 5 L p DatagramSocket p này dùng t o ra m t Socket 6 L p DatagramPacket p này th hi n cho m t gói d li u i l p DatagramSocket liên l c b ng giao th c UDP c g i i b ng giao th c UPD Nó c s d ng III TCP Socket - Liên l c trong ch k t n . to ra mt Socket bng cách s dng hàm to ca lp Socket. Sau ây là t s hàm to ca lp Socket. 3.1 Mt s hàm to ca lp Socket a) public Socket( String. gn vi Socket import java.net.*; import java.io.*; public class SocketInfo { public static void main(String[] args) { try { Socket theSocket = new Socket( "www.theht.edu.vn",

Ngày đăng: 29/09/2013, 09:20

Hình ảnh liên quan

- Ph ngth c public URLConnection openConnection () throws IOException - Lạp trình Socket

h.

ngth c public URLConnection openConnection () throws IOException Xem tại trang 12 của tài liệu.
Ví d sau ly v ni dung ca trang we bc ch nh và in ra màn hình - Lạp trình Socket

d.

sau ly v ni dung ca trang we bc ch nh và in ra màn hình Xem tại trang 12 của tài liệu.
Ví d 1: Nh nv trang index.html tr máy ch web www.theht.edu.vn và in ra màn hình - Lạp trình Socket

d.

1: Nh nv trang index.html tr máy ch web www.theht.edu.vn và in ra màn hình Xem tại trang 24 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan