Điểm giao tiếp giữa máy tính và mạng Được dùng để gửi và nhận dữ liệu Được hỗ trợ bỡi nhiều hệ thống và ngôn ngữ lập trình Phân loại: Server passive socket, client active socke
Trang 1Lý thuyết: 45 tiết
Thực hành: 30 tiết
Trang 3UDP Socket Programming
Trang 4 Các khái niệm liên quan đến lập trình mạng:
Trang 5 Các khái niệm liên quan đến lập trình mạng:
Trang 6 Mạng máy tính:
Mạng máy tính là tập hợp các máy tính hoặc các thiết bị được nối với nhau bởi các đường truyền vật lý và theo một kiến trúc nào đó
Trang 7 Mạng máy tính:
Application (http,ftp,telnet,…)
Transport (TCP, UDP, )
Network (IP, )
Link (device driver, )
Trang 8 Mạng máy tính:
Application (http,ftp,telnet,…)
Transport (TCP, UDP, )
Network (IP, )
Link (device driver, )
UDP (User Datagram Protocol) là giao thức vận
chuyển phi kết nối thực hiện gửi các packets gọi là datagrams từ máy này sang máy khác
Ví dụ:
Clock server
Ping
Trang 9port# data Data
Packet
Trang 10 Ports:
Port là 1 con số nguyên
Một số port đã được dành riêng cho các dịch vụ mạng phổ biến:
Trang 11socket socket
Internet address = 138.37.88.249 Internet address = 138.37.94.248
other ports
Trang 13 Điểm giao tiếp giữa máy tính và mạng
Được dùng để gửi và nhận dữ liệu
Được hỗ trợ bỡi nhiều hệ thống và ngôn ngữ lập trình
Phân loại: Server (passive) socket, client (active) socket và UDP socket
logical connection sockets (end points)
Trang 14 Gói java.net chứa tất cả các lớp cần thiết cho việc lập
trình mạng (Java Sockets Programming)
Trang 15 Lớp InetAddress:
Công dụng:
Biểu diễn một địa chỉ Internet, các địa chỉ IP trong một ứng dụng mạng sử
dụng Java
Lớp này được sử dụng bởi hầu hết các lớp mạng, bao gồm Socket,
ServerSocket, URL, DatagramSocket, DatagramPacket,…
Trang 16 Ví dụ: viết chương trình truy xuất địa chỉ IP
import java.net.InetAddress;
import java.net.UnknownHostException;
public class net_lookup {
public static void main(String[] args) {
Trang 17 Các đối tượng cơ bản trong lập trình mạng TCP Socket
Trang 18 Tạo và sử dụng Server Socket
Trang 19 Ví dụ: tạo ServerSocket
try {
ServerSocket server = new ServerSocket (8888);
while (true) {
Socket incoming = server.accept(); // obtain a client socket
// handle client request by reading from and writing to the
Trang 20 Tạo và sử dụng Client Socket
accept() của lớp ServerSocket
khởi tạo đối tượng
Methods
getInputStream() trả về InputStream để nhận dữ liệu
getOutputStream() trả về OutputStream để gửi dữ liệu
Trang 21 Mô hình truyền / nhận dữ liệu giữa Server và Client:
ServerSocket(1234)
Socket(“128.250.25.158”, 1234)
Output/write stream Input/read stream
Client
Server
Trang 22 Ví dụ 1: viết chương trình cho server nhận thông tin là một chuỗi
ký tự từ phía client gởi lên và chuyển đổi chuỗi này sang chữ hoa
và gởi trả về lại cho phía client dùng phương thức TCP Socket
Server (running on hostid)
create socket, port=x, for incoming request:
welcomeSocket = ServerSocket()
read request from connectionSocket
write reply to connectionSocket
Client
wait for incoming connection request
connectionSocket = welcomeSocket.accept() create socket,connect to hostid, port=x clientSocket = Socket()
send request clientSocket
read reply from clientSocket
TCP connection setup
Trang 23import java.io.*; import java.net.*;
public class tcp_myserver{
public static void main(String args[])
{ try{ //1 creating a server socket
ServerSocket sk = new ServerSocket(6789,10);
//2 Wait for connection
System.out.println("Waiting for connection");
Socket s = sk.accept();
System.out.println("Connection received from " + s.getInetAddress().getHostName());
//3 get Input and Output streams
PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
<< XỬ LÝ DATA NHẬN ĐƯỢC TỪ CLIENT VA TRUYỀN LAI CHO CLIENT>>
Trang 24import java.io.*; import java.net.*;
public class tcp_myserver{
public static void main(String args[])
{ try{ //1 creating a server socket
ServerSocket sk = new ServerSocket(6789,10);
//2 Wait for connection
System.out.println("Waiting for connection");
Socket s = sk.accept();
System.out.println("Connection received from " + s.getInetAddress().getHostName());
//3 get Input and Output streams
PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
<< XỬ LÝ DATA NHẬN ĐƯỢC TỪ CLIENT VA TRUYỀN LAI CHO CLIENT>>
Trang 25import java.io.*; import java.net.*;
public class tcp_myclient{
public static void main(String args[])
{try{ //1 creating a socket to connect to the server
Socket s = new Socket("localhost", 6789);
System.out.println("Connected to localhost in port 6789");
//2 get Input and Output streams
PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
//3: Communicating with the server
<< XỬ LÝ DATA NHẬN ĐƯỢC TỪ SERVER VA TRUYỀN LAI CHO SERVER>>
Trang 26import java.io.*; import java.net.*;
public class tcp_myclient{
public static void main(String args[])
{try{ //1 creating a socket to connect to the server
Socket s = new Socket("localhost", 6789);
System.out.println("Connected to localhost in port 6789");
//2 get Input and Output streams
PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
//3: Communicating with the server
<< XỬ LÝ DATA NHẬN ĐƯỢC TỪ SERVER VA TRUYỀN LAI CHO SERVER>>
Trang 27 UDP
Phi kết nối và không tin cậy
Không đảm bảo bảo toàn dữ liệu
Socket Programming với UDP
Không cần socket làm server
Không có luồng dữ liệu gắn vào các socket
sending hosts đóng gói dữ liệu, IP và port thành packet rồi gửi lên mạng
receiving host nhận packet và rút trích ra thông tin
Các lớp cơ bản lập trình UDP
DatagramSocket: tạo kết nối mạng
DatagramPacket: để đóng gói datagram thành packet truyển trên mạng
dùng để nhận và gửi (Chứa nội dung cần gửi và địa chỉ máy gửi, port)
Trang 29Type Description
Constructors
DatagramPacket( byte[] buf, int len); nhận dữ liệu
DatagramPacket( byte[] buf, int len, InetAddress a, int port); gởi dữ liệu
Methods
byte[] getData();
void setData(byte[] buf);
void setAddress(InetAddress a);
void setPort(int port);
InetAddress getAddress();
int getPort();
Trang 30 Ví dụ 1: viết chương trình cho server nhận thông tin là một chuỗi
ký tự từ phía client gởi lên và chuyển đổi chuỗi này sang chữ hoa
và gởi trả về lại cho phía client dùng phương thức UDP Socket
Trang 31import java.io.*; import java.net.*;
public class tcp_myserver{
public static void main(String args[])
{ try{ byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024];
// 1 Khởi tạo đối tượng
DatagramSocket serverSocket = new DatagramSocket(9876);
System.out.println("Dang cho ket noi tu client");
// 2 Nhận dữ liệu gởi từ client
DatagramPacket receivePacket = new DatagramPacket (receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData());
System.out.println("<Client>: " + sentence);
<< XỬ LÝ DỮ LIỆU ĐÃ NHẬN >>
// 3 Gởi dữ liệu về client
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
serverSocket.close();}}
UDP_MYSERVER.JAVA
Trang 32import java.io.*; import java.net.*;
public class tcp_myserver{
public static void main(String args[])
{ try{ byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024];
// 1 Khởi tạo đối tượng
DatagramSocket serverSocket = new DatagramSocket(9876);
System.out.println("Dang cho ket noi tu client");
// 2 Nhận dữ liệu gởi từ client
DatagramPacket receivePacket = new DatagramPacket (receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData());
System.out.println("<Client>: " + sentence);
<< XỬ LÝ DỮ LIỆU ĐÃ NHẬN >>
// 3 Gởi dữ liệu về client
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
Trang 33import java.io.*; import java.net.*;
public class tcp_myserver{
public static void main(String args[])
{ try{ byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024];
// 1 Khởi tạo đối tượng
DatagramSocket clientSocket = newDatagramSocket(9876);
InetAddress IPAddress = InetAddress.getByName("localhost");
// 2 Gởi dữ liệu đến server
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
System.out.print("<Client>: "); String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = newDatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
// 3 Nhận dữ liệu gởi về từ server
DatagramPacket receivePacket = newDatagramPacket(receiveData, receiveData.length);
Trang 34 RMI vs Socket programming:
Với socket programming, phải tự tạo kết nối và quản lý quá trình truyền nhận dữ liệu
đối tượng trên máy khác (remote objects) giống như là đang chạy trên cùng 1 máy
Trang 35RMI
System
Client JVM Server JVM
JAVA PROGRAM
REMOTE OBJECT
REMOTE METHOD INVOCATION
Trang 36 Local và Remote Objects:
java.rmi.Remote
instanceof, etc)
Trang 37 Định vị Remote Objects:
thông qua giao thức rmi, e.g., rmi://host:port/name
Method Description bind(name, obj) Bind obj to name rebind(name, obj) Bind obj to name even if already bound unbind(name) Remove the binding
lookup(url) Return object bound to url list(url) Return a list of all bindings
Trang 38 Thi hành một phương thức trong RMI
marshalling unmarshalling
Phương thức gọi thi hành có dạng sau:
boolean somemethod(object x, object y)
Trang 39 RMI – Các bước thực hiện (1)
đựợc gọi từ xa của đối tượng
được khai báo
ra các lớp tương ứng và stub cho client, skeleton cho server
Trang 40 Ví dụ 1: viết chương trình cho phép client thực hiện gọi các phương thức từ xa ở phía server để chuyển đổi một chuỗi chữ thường sang một chuỗi chữ hoa và in ra dùng phương thức RMI
Bước 1: Tạo giao diện (interface) MessageInterface khai báo các phương thức đựợc gọi từ xa của đối tượng
import java.rmi.*;
public interface MessageInterface extends Remote {
String receiveMessage( String message) throws RemoteException ;
void printMessageAtServer( String message) throws RemoteException ;
}
MessageInterface.JAVA
Trang 41 Các bước thực hiện :
Bước 2+3: cài đặt (class implement) cho giao diện MessageInterface đã được khai báo và viết chương trình Server
Trang 42 Các bước thực hiện :
Bước 2+3: cài đặt (class implement) cho giao diện MessageInterface đã được khai báo và viết chương trình Server
import java.rmi.*;import java.rmi.registry.*;
import java.rmi.server.*;import java.net.*;
public class rmi_server extends java.rmi.server.UnicastRemoteObject implements
MessageInterface {
<< Cài đặt (class implement) cho giao diện MessageInterface >>
public rmi_server() throws RemoteException {
try{ address = (InetAddress.getLocalHost()).toString();}
catch( Exception e){ System.out.println("can't get inet address.");}
public static void main(String args[]){
try{ rmi_server server = new rmi_server();}
catch (Exception e){e.printStackTrace();System.exit(1);
RMI_MYSERVER.JAVA
Trang 43 Các bước thực hiện :
Bước 2+3: cài đặt (class implement) cho giao diện MessageInterface đã được khai báo và viết chương trình Server
import java.rmi.*;import java.rmi.registry.*;
import java.rmi.server.*;import java.net.*;
public class rmi_server extends java.rmi.server.UnicastRemoteObject implements
MessageInterface {
<< Cài đặt (class implement) cho giao diện MessageInterface >>
public rmi_server() throws RemoteException {
try{ address = (InetAddress.getLocalHost()).toString();}
catch( Exception e){ System.out.println("can't get inet address.");}
public static void main(String args[]){
try{ rmi_server server = new rmi_server();}
catch (Exception e){e.printStackTrace();System.exit(1);
}
Trang 44public class rmi_client {
public static void main(String[] args) {
MessageInterface rmiServer;
int serverPort = 6789;
System.out.println("sending " + text + " to " +serverAddress + ":" + serverPort);
catch(RemoteException e){e.printStackTrace();}
catch(NotBoundException e){System.err.println(e);}
}}
RMI_MYCLIENT.JAVA