Tài liệu Lập trình java nâng cao - Chương 07: Lập trình client/server: LẬP TRÌNH JAVA NCChương 07: LẬP TRÌNH CLIENT/SERVERLê TânBộ môn: Lập trình máy tínhNội dung của chương 07Giao tiếp trên Internet Dịch vụ Server và khái niệm cổngGiao tiếp Client/Server và Socket Các lớp cần thiết của gói thư viện java.net Sử dụng TCP SocketXây dựng chương trình ở ClientXây dựng chương trình ở Server Tầng ứng dụngMục đích:Định nghĩa, sự hoạt động của các giao thức trong tầng ứng dụng.Kiểu khách - người phục vụ (client-server)Những mô hình phục vụTìm hiểu về các giao thức trên tầng ứng dụng thông qua các ví dụ cụ thể.Nâng caoCác giao thức đặc biệt: HTTPftpSMTPpop dnsLập trình các ứng dụng mạng socket APITrình ứng dụng và giao thức tầng ứng dụngTrình ứng dụng : truyền thông, các tiến trình phân tánChạy trên các host(“user space”)Trao đổi thông điệp.e.g., email, ftp, WebGiao thức tầng ứng dụngLà một phần của trình ứng dụng.Xác đình thông điệp trao đổi giữa các ứng dụng.Sử dụng các dịch vụ truyền thông cung cấp bởi các giao thức tầng dưới (TCP, UDP)applicationtransportnetwo...
34 trang |
Chia sẻ: Khủng Long | Lượt xem: 1267 | Lượt tải: 2
Bạn đang xem trước 20 trang mẫu tài liệu Lập trình java nâng cao - Chương 07: Lập trình client/server, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH JAVA NCChương 07: LẬP TRÌNH CLIENT/SERVERLê TânBộ môn: Lập trình máy tínhNội dung của chương 07Giao tiếp trên Internet Dịch vụ Server và khái niệm cổngGiao tiếp Client/Server và Socket Các lớp cần thiết của gói thư viện java.net Sử dụng TCP SocketXây dựng chương trình ở ClientXây dựng chương trình ở Server Tầng ứng dụngMục đích:Định nghĩa, sự hoạt động của các giao thức trong tầng ứng dụng.Kiểu khách - người phục vụ (client-server)Những mô hình phục vụTìm hiểu về các giao thức trên tầng ứng dụng thông qua các ví dụ cụ thể.Nâng caoCác giao thức đặc biệt: HTTPftpSMTPpop dnsLập trình các ứng dụng mạng socket APITrình ứng dụng và giao thức tầng ứng dụngTrình ứng dụng : truyền thông, các tiến trình phân tánChạy trên các host(“user space”)Trao đổi thông điệp.e.g., email, ftp, WebGiao thức tầng ứng dụngLà một phần của trình ứng dụng.Xác đình thông điệp trao đổi giữa các ứng dụng.Sử dụng các dịch vụ truyền thông cung cấp bởi các giao thức tầng dưới (TCP, UDP)applicationtransportnetworkdata linkphysicalapplicationtransportnetworkdata linkphysicalapplicationtransportnetworkdata linkphysicalMột số thuật ngữ trình ứng dụng mạngTiến trình : là chương trình chạy trên host.Trong cùng một host, hai tiến trình có thể truyền thông với nhau qua interprocess communication (điều khiển bởi hệ điều hành).Các tiến trình chạy trên các host khác nhau truyền thông qua giao thức tầng ứng dụng.user agent: là phần mềm xử lý giao diện giữa người dùng và mạng. Thực hiện theo các giao thức tầng ứng dụng.Web: browserE-mail: mail readerstreaming audio/video: media playerMô hình Client-ServerĐặc trưng cho ứng dụng gồm hai thành phần : client và serverapplicationtransportnetworkdata linkphysicalapplicationtransportnetworkdata linkphysicalClient:Khởi tạo giao tiếp với server (“speaks first”)Yêu cầu dịch vụ từ server.Web : client nhận và hiển thị web page ; e-mail: các trình đọc thư.Server:Cung cấp những dịch vụ được yêu cầu từ Cliente.g., Web server gửi Web page, Mail server phân phát e-mailrequestreplyGiao thức tầng ứng dụngAPI: application programming interfaceĐịnh ra giao diện giữa tầng ứng dụng và tầng mạng.Socket : Internet APIHai tiến trình truyền thông bằng cách gửi/đọc dữ liệu vào/từ socket.Q: Phân biệt các tiến trình bằng cách nào?Địa chỉ IP của host.“Số hiệu cổng”: cho phép bên host nhận phân biết các tiến trình cục bộ.Dịch vụ CổngFPT 21HTTP 80Telnet 23Finger 79SMTP 25Các dịch vụ tầng giao vận cung cấp cho ứng dụng?Mất mát dữ liệu(Data loss)Một số ứng dụng(e.g., audio) có thể chấp nhận một số mất mát.Một số ứng dụng lại đòi hỏi (e.g., file transfer, telnet) 100% dữ liệu truyền tin cậy.Thời gian(Timing)Một số ứng dụng (e.g.,hội thoại qua Internet,các trò chơi hành động) đòi hỏi độ trễ thấp.Băng thông(Bandwidth)Một số ứng dụng(e.g., multimedia) yêu cầu băng thông tối thiểu để có thể truyền thông hiệu quả.Một số ứng dụng khác (“elastic apps”) lại có thể sử dụng bất cứ băng thông nào mà chúng nhận được.Các yêu cầu cho một số ứng dụngApplicationfile transfere-mailWeb documentsreal-time audio/videostored audio/videointeractive gamesfinancial appsData lossno lossno lossloss-tolerantloss-tolerantloss-tolerantloss-tolerantno lossBandwidthelasticelasticelasticaudio: 5Kb-1Mbvideo:10Kb-5Mbsame as above few Kbps upelasticTime Sensitivenononoyes, 100’s msecyes, few secsyes, 100’s msecyes and noDịch vụ của các giao thức giao vận trên InternetDịch vụ TCP:Hướng kết nối : Yêu cầu thiết lập kết nối giữa client và server.Truyền dữ liệu tin cậy giữa tiến trình gửi và nhậnĐiều tiết luồng : bên gửi sẽ không làm “lụt” bên nhận.Điều tiết tắc nghẽn: điều chỉnh tốc độ gửi khi mạng quá tải.Không hỗ trợ : thời gian, băng thông tối thiểu.Dịch vụ UDP:Truyền dữ liệu không tin cậy giữa các tiến trình gửi và nhận.Không hỗ trợ : thiết lập kết nối, độ tin cậy, điều tiết luồng, điều tiết tắc nghẽn,thời gian,băng thông tối thiểu.Q: Tại sao một số ứng dụng dùng UDP?Các ứng dụng trên Internet và giao thức giao vận tương ứngApplicatione-mailremote terminal accessWeb file transferstreaming multimediaremote file serverInternet telephonyApplicationlayer protocolSMTP [RFC 821]telnet [RFC 854]HTTP [RFC 2068]ftp [RFC 959]proprietary(e.g. RealNetworks)NSFproprietary(e.g., Vocaltec)Underlyingtransport protocolTCPTCPTCPTCPTCP or UDPTCP or UDPtypically UDPLập trình SocketSocket APIintroduced in BSD4.1 UNIX, Tạo, sử dụng và huỷ bởi ứng dụng. Sử dụng cho mô high client/serverHai kiểu dịch vụ tần ứng dụng sử dụng socket API: Truyền datagram không tin cậyTin cậy, hướng kết nối theo byte.a host-local, application-created/owned, OS-controlled interface (a “door”) into whichapplication process can both send and receive messages to/from another (remote or local) application processsocketMục đích : Nghiên cứu cách để xây dựng một ứng dụng client/server application mà giao tiếp bằng socket.Lập trình Socket TCPSocket: Là “cánh cửa” giữa tiến trình tầng ứng dụng và giao thức giao vận end-end (UCP/TCP)TCP: là dịch vụ truyền tin cậy theo bytes từ tiến trình này đến tiến trình khác.processTCP withbuffers,variablessocketNgười phát triển điều khiển Điều khiển bởi hệ điều hànhhost orserverprocessTCP withbuffers,variablessocketNgười phát triển điều khiển Điều khiển bởi hệ điều hànhhost orserverinternetLập trình Socket TCPClient phải giao tiếp với serverTiến trình trên server phải đang chạy.server phải tạo sẵn socket (door) để tiếp nhận yêu cầu của client.Client giao tiếp với server bắng cách:Tạo client-local TCP socketXác định địa chỉ IP,số hiệu cổng của tiến trình trên server.Khi client tạo socket: client TCP thiết lập kết nối tới server TCP.Khi nhận được giao tiếp từ client,server TCP tạo socket mới cho tiến trình trên server truyền thông với clientCho phép server có thể đáp ứng yêu cầu của nhiều client.Trên quan điểm ứng dụngTCP cung cấp dịch vụ truyền dữ liệu tin cậy theo bytes(kiểu đường ống) giữa Client và serverLớp InetAddressQuản lý địa chỉ theo tên và số IP.static InetAddress getLocalHost(): trả về địa chỉ máy cục bộstatic InetAddress getByName(String host): nhận địa chỉ máy kiểu chuỗi, trả về đối tượng InetAddress thay mặt cho địa chỉ máy này.public String getHostName(): trả về tên của đối tượng InetAddress theo dạng String.public byte[] getAddress(): trả về địa chỉ IP của đối tượng InetAddress theo dạng mảng các byte.public String getHostAddress(): trả về địa chỉ IP của đối tượng InetAddress theo dạng String.Ví dụ: Chương trình lấy thông tin địa chỉ máy chủimport java.net.*;public class AddrLookupApp { public static void main(String[] args) { try { if (args.length!=1) { System.out.println("Usage: Java AddrLookupApp "); return;} InetAddress host = InetAddress.getByName(args[0]); String hostName = host.getHostName(); System.out.println("Host name:" + hostName); System.out.println("IP Address:" + host.getHostAddress()); } catch (UnknownHostException e) { System.out.print("Address not found"); return;} }} Lớp SocketTạo kết nối từ máy khách tới máy chủ.public Socket(String host, int port): tạo một kết nối theo địa chỉ host và số cổng port.public Socket(InetAddress address, int port): tạo một kết nối theo địa chỉ là đối tượng InetAddress và số cổng port.public Socket(String host, int port, boolean stream): tạo một kết nối theo địa chỉ host và số cổng port, stream = true để quy định kết nối theo TCP, ngược lại, kết nối theo UDP (User Datagram Protocol).Các phương thức hỗ trợ của lớp SocketInputStream getInputStream(): Lấy về luồng nhập để nhận dữ liệu.OutputStream getOutputStream(): Lấy về luồng xuất để gửi dữ liệu.int getPort(): Lấy về số hiệu cổng kết nối của máy chủ.synchronized void close(): Cắt đứt kết nối với máy chủ.Lớp ServerSocketTạo kết nối từ máy chủ tới máy khách.public ServerSocket(int port): tạo một đối tượng lắng nghe những kết nối từ máy khách theo số cổng port.Socket accept(): dừng lại chờ cho đến khi nhận được kết nối và trả về đối tượng Socket của máy khách.synchronized void close(): Cắt đứt kết nối với máy khách.Lập trình Socket TCPVí dụ một ứng dụng client-server:Client đọc một dòng kí tự từ input chuẩn (inFromUser stream) , gửi tới server qua socket (outToServer stream)server đọc dòng kí tự trong socketsserver biến đổi dòng kí tự đó thành dòng kí tự chỉ gồm các chữ hoa và gửi trả về cho client.client đọc,in ra dòng kí tự đã biến đổi từ socket (inFromServer stream)Input stream: sequence of bytesinto processoutput stream: sequence of bytes out of processClientprocessclient TCP socketTương tác socket Client/server : TCPwait for incomingconnection requestconnectionSocket =welcomeSocket.accept()create socket,port=x, forincoming request:welcomeSocket = ServerSocket()create socket,connect to hostid, port=xclientSocket = Socket()closeconnectionSocketread reply fromclientSocketcloseclientSocketServerClientsend request usingclientSocketread request fromconnectionSocketwrite reply toconnectionSocketTCP connection setupVí dụ về Java Server (TCP)import java.io.*; import java.net.*; class TCPClient { public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence; BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("hostname", 6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); Tạo input streamTạo client socket, kết nối tới serverTạo output stream, đính kèm vàosocketVí dụ về Java Server (TCP) BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + '\n'); modifiedSentence = inFromServer.readLine(); System.out.println("FROM SERVER: " + modifiedSentence); clientSocket.close(); } } Tạo input stream, đính kèm vào trong socketGửi dòng kí tựđến serverĐọc dòng kí tự(đã biến đổi) gửi về từ serverVí dụ về Java Server (TCP)import java.io.*; import java.net.*; class TCPServer { public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); Tạo sẵn Socket ở cổng 6789Đợi đến khi có socket từ client gửi đếnTạo input stream, đính kèm vào socketVí dụ về Java Server (TCP) DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); capitalizedSentence = clientSentence.toUpperCase() + '\n'; outToClient.writeBytes(capitalizedSentence); } } } Đọc dòng kí tự trong socketTạo output stream,đính kèm vào socketGhi dòng kí tự đã biến đổi vào socketKết thúc vòng lặp while,quay trở về vòng lặp cha,đợi kết nối khácLập trình Socket UDPUDP: không thiết lập kết nối giữa client và serverKhông “bắt tay”.Bên gửi phải xác định chính xác địa chỉ IP và cổng của bên nhận.Server xác định địa chỉ IP và cổng của bên gửi từ datagram nhận được.UDP : giao thức truyền dữ liệu chấp nhận không đúng thứ tự hay mất mát.Trên quan điểm ứng dụngUDP cung cấp dịch vụ truyền dữ liệu không tin cậy theo byte (“datagrams”)giữa Client và ServerTương tác socket Client/server : UDPcloseclientSocketServerread reply fromclientSocketcreate socket,clientSocket = DatagramSocket()ClientCreate, address (hostid, port=x,send datagram request using clientSocketcreate socket,port=x, forincoming request:serverSocket = DatagramSocket()read request fromserverSocketwrite reply toserverSocketspecifying clienthost address,port umberVí dụ về Java client (UDP)Output: sends packet (TCP sent “byte stream”)Input: receives packet (TCP received “byte stream”)Clientprocessclient UDP socketVí dụ về Java client (UDP)import java.io.*; import java.net.*; class UDPClient { public static void main(String args[]) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("hostname"); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine(); sendData = sentence.getBytes(); Tạo input streamTạo client socketChuyển hostname thành địa chỉ IP sử dụng DNSVí dụ về Java client (UDP) DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); } } Tạo datagram cùngvới dữ liệu,độ dài, địa chỉ IP, cổngGửi datagramtới serverĐọc datagramgửi về từ serverVí dụ về Java server (UDP)import java.io.*; import java.net.*; class UDPServer { public static void main(String args[]) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); Tạo datagram socketở cổng 9876Tạo datagram nhậnNhận datagramVí dụ về Java server (UDP) String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } } } Nhận địa chỉ IP, cổng của bên gửiĐính datagramvào socketKết thúc vòng lặp while,Quay trở về vòng lặp cha,đợi datagram khác đếnTạo datagram đểgửi tới client Lập trình Socket: tham khảoC-language tutorial (audio/slides): “Unix Network Programming” (J. Kurose),“All About Sockets” (Sun tutorial), “Socket Programming in Java: a tutorial,” ÚC CÁC ANH/CHỊTHÀNH CÔNG!
Các file đính kèm theo tài liệu này:
- tailieu.ppt