1 / 80

Chapter 8

Chapter 8. Lập trình mạng với Java - TCP Socket GV: Nguyễn Thị Thanh Vân - CNTT. Objectives. Giao tiếp Socket Đặc điểm, cấu trúc Socket TCP Socket UDP Socket Thiết kế giải thuật server/client Các lớp trong gói java.net Ứng dụng client/server qua TCP socket

elvis
Télécharger la présentation

Chapter 8

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 8 Lập trình mạng với Java - TCP Socket GV: Nguyễn Thị Thanh Vân - CNTT

  2. Objectives • Giao tiếp Socket • Đặc điểm, cấu trúc Socket • TCP Socket • UDP Socket • Thiết kế giải thuật server/client • Các lớp trong gói java.net • Ứng dụng client/server qua TCP socket • Ứng dụng client/server qua UDP socket

  3. Giới thiệu • Trong quá trình truyền tin có thể xảy ra nhiều sự cố: • một hay nhiều gói bị mất hay bị hỏng • cần phải truyền lại hay không hoặc • các gói tin đến không theo đúng trình tự. • Cần xử lý; • việc phân chia dữ liệu thành các gói, • tạo các header, phân tích header của các gói đến, • quản lý danh sách các gói đã nhận được/ chưa nhận được… • => nhiều công việc cần phải thực hiện, và đòi hỏi rất nhiều phần mềm phức tạp để xử lý. => Socket

  4. Giới thiệu • Socket API – Socket Application Programming Interface: • là một cuộc cách mạng của Berkeley UNIX. • đượcgiớithiệu ở BSD4.1 UNIX, 1981 • Xuất phát từ ý tưởng quan trọng nhất của UNIX: • tất cả các thao tác vào/ra giống như vào ra tệp tin • Socket xem một liên kết mạng như là một luồng mà có thể đọc dữ liệu ra hay ghi dữ liệu vào từ luồng này. • Nóche dấu người lập trình khỏi các chi tiết mức thấp của mạng như môi kiểu đường truyền, các kích thước gói, yêu cầu truyền lại gói, các địa chỉ mạng...

  5. KHÁI NIỆM VỀ SOCKET • Socket: • “cơ chế ổ cắm” • Các máy có khả năng kết nối được với nhau. • Dùng cơ chế client/server • Cung cấphaidịch vụ chính chuyểndữ liệuthôngqua socket API: • unreliable datagram (UDP) • reliable, byte stream-oriented (TCP)

  6. Socket trong TCP/IP Model

  7. Socket trong TCP/IP Model

  8. Socket • socket được định nghĩa trong hệ điều hành bằng một cấu trúc, được xem như điểm nối để hai procceses giao tiếp với nhau. • Cấu trúc socket gồm 5 fields: • Family : xác định protocol group • Type : xác loại socket, stream, datagram hay raw socket. • Protocol : kieu gthuc. thường gán giá trị bằng 0 • Local Socket Address và • Remote Socket Address : là địa chỉ socket của process cục bộ và từ xa.

  9. Cấu trúc socket

  10. Địa chỉ của một socket • Địa chỉ của một socket trên mạng TCP/IP gồm có hai phần: • Địa chỉ IP: một số nguyên 32 bits xác định duy nhất một card mạng trên máy tính (host) • Cổng dịch vụ: một số nguyên 16 bits xác định điểm kết nối với một ứng dụng trên một host. Các ứng dụng thương mại hay các dịch vụ thông dụng sử dụng các cổng dịch vụ chuẩn đã được đăng ký

  11. Ví dụ mô tả đặc trưng địa chỉ IP và port trong các socket giao tiếp 3 dịch vụ khác nhau CLIENT IP: 192.168.0.15 SERVER IP: 192.168.0.1 HTTP-SERVER Web browser Port 80 Kết nối với socket(192.168.0.1, 80) FTP-SERVER FTP-client Port 21 Kết nối với socket(192.168.0.1, 21) SQL-SERVER data application Port 1433 Kết nối với socket(192.168.0.1, 1433)

  12. Cấu trúc địa chỉ socket struct sockaddr_in { u_char sin_len; u_short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };

  13. Các hàm socket (in System Calls Interface ) • Hàm socket() để tạo mới một socket • Hàm bind() Đăng ký socket đã khởi tạo với địa chỉ socket local. Trả về 0 nếu thành công, -1: thất bại. • Hàm connect() để client kết nối đến server • Hàm listen() đặt socket ở trạng thái chờ, lắng nghe kết nối từ phía client • Hàm accept() : chấp nhận kết nối từ client đến • Hàm read() để đọc dữ liệu từ socket vào bộ nhớ • Hàm write() để ghi dữ liệu từ bộ nhớ -> socket • Hàm sendto() để gởi dữ liệuđến một socket từ xa • Hàm recvfrom():nhận dữ liệuđến từ 1 socket từ xa

  14. Các loại Socket • Stream Socket: dùng cho connection-oriented protocol như TCP. • Datagram Socket: dùng cho connectionless protocol như UDP. • Raw Socket: dùng cho một số protocol của một số ứng dụng đặc biệt, dùng các dịch vụ trực tiếp của lớp IP.

  15. TCP socket – đặc điểm • Có thể sử dụng để liên lạc theo mô hình client/server • Có 1 đường kết nối ảo giữa 2 phía Server/client • Một trong 2 phía phải đợi tiến trình kia yêu cầu kết nối • Server lắng nghe và chấp nhận yêu cầu kết nối • Mỗi thông điệp gửi đều có xác nhận trở về • Các gói tin chuyển đi tuần tự

  16. TCP socket – hoạt động • Client phải kết nối đến server • server process phải chạy trước (phần tử thụ động) • server phải tạo một socket để lắng nghe và chấp nhận các kết nối từ client • Client kết nối đến server bằng cách: • Khởi tạo TCP socket ở local • Xác định IP address, port number của server process và kết nối đến • Sau khi client khởi tạo socket, nó sẽ thiết lập kết nối đến server • Khi server nhận yêu cầu kết nối, nó sẽ chấp nhận yêu cầu và khởi tạo socket mới để giao tiếp với client. • Cho phép server chấp nhận nhiều client tại một thời điểm.

  17. TCP socket - hoạt động

  18. UDP socket – đặc điểm • Cung cấp cơ chế truyền không tin cậy các nhóm bytes(datagrams) giữa client và server. • Không cần thiết lập kết nối giữa client với server. • Clientphải gởi kèm địa chỉ IP và port đích • Server khi nhận dữ liệu sẽ phân tích địa chỉ của clientđể truyền lại. -- • Thông điệp có thể gửi nhiều lần • Người gửi không chắc chắn thông điệp tới người nhận • Thông điệp sau có thể đến đích trước thông điệp gửi trước nó

  19. UDP socket – hoạt động

  20. Số hiệu cổng của socket • Một trong 2 quá trình phải công bố số hiệu cổng của socket mà mình sử dụng • Mỗi cổng giao tiếp thể hiện 1 địa chỉ xác định trong hệ thống • Có thể nhận dữ liệu gửi đến cổng giao tiếp này từ các quá trình khác.

  21. Viết các ứng dụng Socket • Thiết kế giải thuật cho client/Server. • Công cụ viết • Dùng các class trong Java • Example

  22. Thiếtkế giảithuật cho client/Server • Giảithuậtchochương trình client/Serverdùng TCP • Giảithuậtchochương trình client/Serverdùng UDP • Chương trình server có hai loại: • Lặp(iterative) • Đồng thời (concurrent). • Hai dạng giao thứcchương trình server: • Connection-oriented (TCP) • Connectionless. (UDP)

  23. Giảithuật cho client/Server TCP • Client • Xác định địachỉ server. • Tạo socket. • Kết nối đến Server • Gởi/nhậndữ liệutheogiaothứcđãthiết kế. • Đóng socket. • Server • Tạo socket • Đăng ký với hệ thống • Lắng nghe kết nối • Chấp nhận kết nối • Gửi nhận dữ liệu theo đúng giao thức đã thiết kế. • Đóng kết nối sau khi đã hoàn thành và trở lại trạng thái lắng nghe chờ kết nối mới

  24. Giảithuật cho client/Server UDP • Client • Xác định địachỉ server. • Tạo socket. • Gởi/nhậndữ liệutheogiaothứcđãthiết kế. • Đóng socket. • Server • Tạo socket • Đăng ký với hệ thống • Lặp công việc đọc dữ liệu từ client gửi đến và gửi trả kết quả cho client theo đúng giao thức lớp ứng dụng đã thiết kế. • Đóng Socket

  25. Thiếtkế giảithuật cho Server– concurrent, connection-oriented (TCP) • Tạo socket và đăng ký với hệ thống • Đặt socket ở chế độ chờ, lắng nghe kết nối. • Khi có request từ client, Server sẽ: • chấp nhận kết nối, • tạo một process con để xử lý. • Quay lại trạng thái chờ, lắng nghe kết nối mới • Công việc của process con: • Nhận thông tin kết nối của client • Giao tiếp với client theo giao thức lớp ứng dụng đã thiết kế • Đóng kết nối và kết thúc process con. • Đóng socket

  26. Thiếtkế giảithuật cho Server– concurrent, connectionless (UDP) • Tạo socket và đăng ký với hệ thống • Lặp công việc nhận dữ liệu từ client, đối với một dữ liệu nhận: • tạo mới một process để xử lý. • Tiếp tục nhận dữ liệu mới từ client • Công việc của process mới: • Nhận thông tin của process cha chuyển đến, lấy thông tin socket • Xử lý và gửi thông tin về cho client theo giao thức lớp ứng dụng đã thiết kế • Kết thúc

  27. Thiết kế giải thuật server – multi-protocol Server (TCP/UDP) • Dùng một chương trình, mở một master socket cho cả TCP và UDP. • Dùng hàm hệ thống (select) để chọn lựa TCP socket hay UDP socket sẵn sàng. • Tùy vào protocol (TCP, UDP) để xử lý gửi nhận thông điệp theo đúng giao thức của lớp ứng dụng • Ref RFC 1060

  28. Lập trình mạng trên Java • Gói java.net cung cấp các lớp • InetAddress • URL • URLConnection • ServerSocket • Socket • DatagramSocket • DatagramPacket Dùng cho TCP Socket Dùng cho UDP Socket

  29. InetAddress class • Phục vụ việc quản lý địachỉ theo IP và tên. • Cung cấp các phương thức thông dụng nhất dùng để chuyển đổi và truy xuất IP • Nó bao gồm hai trường thông tin: (không thể truy xất chúng trực tiếp) • hostName (một đối tượng kiểu String) và • address (một số kiểu int). • Lớp InetAddress không có các constructor cho lớp InetAddress • Có các phương thức:

  30. InetAddress class Tất cả các phương thức này đều thực hiện kết nối tới server DNS cục bộ để biết được các thông tin trong đối tượng InetAddress: • public static InetAddessgetLocalHost()throws UnknownHostExceptiongetByName Trả về InetAddress là IP của local • public static InetAddess getByName(String hostname) throws UnknownHostException: Nhận tên host và trả về InetAddress (name và IP address) • public static InetAddess []getAllByName(Stringhostname) throws UnknownHostException Nhận địa chỉ host dạng String và trả về tất cả InetAddress tương ứng với host (name và IP address)

  31. InetAddress class • Nhận các trường thông tin của một đối tượng InetAddress: • Chỉ có các lớp trong gói java.net có quyền truy xuất tới các trường của lớp InetAddress. bằng các phương thức: • public byte[] getAddress() Trả về một địa chỉ IP dưới dạng một mảng các byte. • public String getHostAddress() Trả về một địa chỉ IP dưới dạng String "%d.%d.%d.%d" • public String getHostName() Trả về một xâu biểu diễn hostname của một đối tượng InetAddress. Nếu máy không có hostname, thì sẽ trả về "%d.%d.%d.%d"

  32. Ex: In địachỉ IP và name củalocalhost import java.net.*; public class HostInfo { public static void main(String args[]) { try { InetAddressmyHost = InetAddress.getLocalHost(); System.out.println(myHost.getHostAddress()); System.out.println(myHost.getHostName()); } catch (UnknownHostException ex) { System.err.println("Cannot find local host");} } }

  33. Ex: In IP của www.google.com import java.net.*; class Print_IP{ publicstaticvoid main (String args[]) { try { InetAddress[] addresses = InetAddress.getAllByName("www.google.com"); for (int i = 0; i < addresses.length; i++) { System.out.println(addresses[i]); } } catch (UnknownHostException e) { System.out.println("Could not find www.google.edu.vn"); } } }

  34. URL • URL(Uniform Resource Locator) là địa chỉ định vị tài nguyên trên mạng, • Một URL thườngbao gồm 3 phần: • Protocol • Hostname • Filename. • (port) • Java đóng gói tất cả vào một lớp URL. • Đối tượng URL được tạo ra bằng một trong những phương thức khởi tạo sau:

  35. URL class - Constructors • public URL(String spec) throws MalformedURLException Tạo một đối tượng URL từ địa chỉ định vị là một chuỗi. (simple) • public URL(String pro,String host, int port, String file) throwsMalformedURLException Tạo một địa chỉ định vị tuyệt đối với đầy đủ nghi thức(protocol), máy chủ(server), cổng(port), đường dẫn(file) tới tập tin cần lấy trên máy chủ. • public URL(String protocol, String host, String file) throws MalformedURLException Tạo một địa chỉ định vị tuyệt đối với đầy đủ protoccol, server, path file

  36. Phân tích một URL thành các thành phần • public final Object getContent() throws IOException :lấy về nội dung mà kết nối theo địa chỉ URL có được. • String getFile() :Lấy về tên tập tin hay tài liệu nằm trong chuỗi địa chỉ URL có được. • String getHost() :Lấy tên máy chủ(thường là thành phần thức 2 của chuỗi URL) • String getPort() :Lấy về số hiệu cổng. • String getProtocol() :Lấy về tên giao thức(thường là thành phần đầu tiên trong chuỗi URL) • String getRef() :Lấy về nội dung chuỗi tham khảo thêm trong chuỗi URL(được đặt sau dấu # của chuỗi)

  37. URL class - ex import java.net.*; importjava.io.*; publicclass GetURLInfor { publicstaticvoid main(String[] args) throws Exception { URL aURL = new URL("http://google.com:80/docs/books/tutorial" + "/index.html?name=networking#DOWNLOADING"); System.out.println("protocol = " + aURL.getProtocol()); System.out.println("authority = " + aURL.getAuthority()); System.out.println("host = " + aURL.getHost()); System.out.println("port = " + aURL.getPort()); System.out.println("path = " + aURL.getPath()); System.out.println("query = " + aURL.getQuery()); System.out.println("filename = " + aURL.getFile()); System.out.println("ref = " + aURL.getRef()); } }

  38. Tìm kiếm dữ liệu từ một URL • public final InputStream openStream() throws IOException: kết nối tới một tài nguyên được tham chiếu bởi một URL, thực hiện mở luồng nhập để đọc thông tin trả về từ máy chủ • public URLConnection openConnection() throws java.io.IOException: Mở một socket tới một URL xác định và trả về một đối tượng URL. • public final Object getContent() throws java.io.IOException: Cung cấp cách tải dữ liệu được tham chiếu bởi một URL

  39. URL class: ex get text import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; publicclass getText { publicstaticvoid main(String[] argv) throws Exception { URL url = new URL("http://tintuconline.com.vn/vn/index.html"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { System.out.println(str); } in.close(); } }

  40. URLConnection class • URLConnection là một lớp trừu tượng biểu diễn một liên kết tích cực tới một tài nguyên được xác định bởi 1URL. • Ý nghĩa của lớp URLConnection: • Cung cấp nhiều khả năng điều khiển hơn thông qua việc tương tác với một server chứ không phải lớp URL: • kiểm tra các headerMIME được gửi bởi một Http Server. • tải về các tệp nhị phân. • gửi dữ liệu trở lại Web server bằng lệnh POST. • Là một phần của cơ chế quản trị giao thức • phân tích các chi tiết xử lý một giao thức với việc xử lý các kiểu dữ liệu cụ thể, • cung cấp các giao diện người dùng, và thực hiện các công việc khác mà một trình duyệt thường làm.

  41. Mở các URLConnection • Một chương trình sử dụng lớp URLConnection trực tiếp theo một dãy các bước cơ bản sau: • Xây dựng một đối tượng URL. • Gọi phương thức openConnection() của đối tượng URL để tìm kiếm một đối tượng URLConnection cho URL đó. • Cấu hình đối tượng URL. • Đọc các trường header. • Nhận một luồng nhập và đọc dữ liệu. • Nhận một luồng xuất và ghi dữ liệu. • Đóng liên kết.

  42. Ex, xây dựng 1 URLConnection u= new URL("http://www.microsoft.com"); URLConnection uc; uc=u.openConnection();

  43. Methods: read/write data • public Object getContent() throws IOException chỉ làm việc khi Java có một trình quản lý nội dung cho kiểu nội dung. tải về đối tượng được chọn bởi URL của URLConnection này. • public InputStream getInputStream() luồng này cho phép tự đọc và phân tích dữ liệu. • public OutputStream getOutputStream() ghi dữ liệu vào một URLConnection. Trả về một luồng OutputStream trên đó có thể ghi dữ liệu để truyền tới một server. Phải gọi phương thức setDoOutput() trước khi yêu cầu một luồng xuất. (URLCon. ko cho phép xuất default)

  44. Đọc dữ liệu từ một server • Các bước tối thiểu cần để tìm kiếm dữ liệu từ một URL bằng cách sử dụng đối tượng URLConnection: • Bước 1: Xây dựng một đối tượng URL. • Bước 2: Gọi phương thức openConnection() của lớp URL để tìm kiếm một đối tượng URL Connection cho đối tượng URL đó. • Bước 3: Gọi phương thức getInputStream(). • Bước 4: Đọc từ luồng nhập bằng cách sử dụng API.

  45. Ex, get source web hcmute.edu.vn import java.net.*; import java.io.*; publicclass getText { publicstaticvoid main(String[] args) throws MalformedURLException { String thisLine; URL u; URLConnection uc; u =new URL("http://www.hcmute.edu.vn"); try{ uc=u.openConnection(); DataInputStream theHtml = newDataInputStream(uc.getInputStream()); try{ while((thisLine=theHtml.readLine())!=null) System.out.println(thisLine); } catch(Exception e) { System.err.println(e); } } catch(Exception e) { System.err.println(e); } } }

  46. Ex: send data to server try{ URL u = new URL(http://www.hcmute.edu.vn); URLConnection uc = u.openConnection(); uc.setDoOutput(true); DataOutputStream dos = new DataOutputStream(uc.getOutputStream()); dos.writeByte(“Here is some data”); } catch(Exception e) { System.err.println(e); }

  47. Phân tích Header • HTTP Server cung cấp một số lượng thông tin đáng kể trong các header MIME trước mỗi đáp ứng. • Thông tin trong các header MIME có thể: • cơ chế mã hóa nội dung được sử dụng, • chiều dài của nội dung được trả về bằng byte • ngày và giờtruy nhập cuối • ngày hết hạn của nội dung, • ngày mà nội dung được sửa đổi lần cuối. • Có thểtruy vấn một URLConnection để tìm ra thông tin MIME nào mà server đã cung cấp. • Ngoài HTTP, rất ít giao thức sử dụng các header MIME.

  48. Methods • public String getContentType() trả về kiểu nội dung MIME của dữ liệu. Nó phụ thuộc vào web server gửi một header MIME tương ứng. Các kiểu nội dung phổ biến khác bao gồm: text/plain, image/gif, image/jpeg. • public int getContentLength() cho biết nội dung có kích thước bao nhiêu byte. • public String getContentEncoding() trả về String cho ta biết cách thức mã hóa. Nếu nội dung được gửi không được mã hóa (như trong trường hợp của HTTP server), • public long getDate() trả về một số nguyên kiểu long cho bạn biết tài liệu đã được gửi khi nào. Ta có thể chuyển đổi nó sang một đối tượng kiểu java.util.Date. • public long getExpiration() • public long getLastModified()

  49. URL class - ex publicclass GetURLInfor { publicstaticvoid printinfo(URL url) throws IOException { URLConnection c = url.openConnection(); // Get URLConnection from URL c.connect(); // Open a connection to URL System.out.println(" Content Type: " + c.getContentType()); System.out.println(" Content Encoding: " + c.getContentEncoding()); System.out.println(" Content Length: " + c.getContentLength()); System.out.println(" Date: " + new Date(c.getDate())); if(c instanceof HttpURLConnection) { HttpURLConnection h = (HttpURLConnection) c; System.out.println(" Request Method: " + h.getRequestMethod()); System.out.println(" Response Message: " + h.getResponseMessage()); System.out.println(" Response Code: " + h.getResponseCode());} } publicstaticvoid main(String[] args) { try { printinfo(new URL(args[0])); } catch (Exception e) {System.err.println(e + " Not found URL"); System.err.println("Usage: java GetURLInfo <url>"); } } }

  50. Socket trong Java • Java cung cấp lớp (trong thư viện java.net) • ServerSocket (thường dùng cho server) và • Socket (thường dùng cho client) có thể được sử dụng cho server • Có các phương thức tương ứng với cácthao tác của server và client

More Related