Lê đình Thanh, Lập trình socket Nội dung Ớ Truyền thông giữa các ứng dụng Ớ Socket Ớ Lập trình socket Ớ đa luồng 4 Truyền thông giữa các ứng dụng Ứng dụng A1 Ứng dụng B1 Chào B1.. Lê đì
Trang 1Lê đình Thanh, Lập trình socket
Lê đình Thanh
Bộ môn Mạng và Truyền thông Máy tắnh Khoa Công nghệ Thông tin Trường đại học Công nghệ, đHQGHN
Bài giảng
LẬP TRÌNH JAVA
2
Lập trình socket
Bài 9
Trang 2Lê đình Thanh, Lập trình socket
Nội dung
Ớ Truyền thông giữa các ứng dụng
Ớ Socket
Ớ Lập trình socket
Ớ đa luồng
4
Truyền thông giữa các ứng dụng
Ứng dụng A1 Ứng dụng B1
Chào B1 Tôi là A1 Bạn cần nói chuyện không
Chào A1 Tôi sẵn sàng
Tôi cần Ầ
đây là thứ bạn cần
Ầ Cảm ơn nhiều nhé Hẹn gặp lại
Ok Hẹn gặp lại
Trang 3Lê đình Thanh, Lập trình socket
Truyền thông giữa các ứng dụng
Ớ Một ứng dụng (B1) phải chạy trước, chờ xem có ứng dụng khác cần giao tiếp không
Ớ Ứng dụng cần giao tiếp (A1) thiết lập kết nối ựến ứng dụng
lắng nghe (B1)
Ớ Hai bên bàn thảo về một việc gì ựó (theo giao thức)
Ớ A1/B1 muốn kết thúc sẽ chào tạm biệt trước, B1/A1 sẽ tạm biệt lại
6
Truyền thông giữa các ứng dụng
Ứng dụng A1 Ứng dụng B1
Chào B1 Tôi là A1 Bạn cần nói chuyện không
Chào A1 Tôi sẵn sàng
Tôi cần Ầ
đây là thứ bạn cần
Ầ Cảm ơn nhiều nhé Hẹn gặp lại
Ok Hẹn gặp lại
Ứng dụng A2 Ứng dụng B2
Chào B2 Tôi là A2 Bạn cần nói chuyện không
Chào A2 Tôi sẵn sàng
Tôi cần Ầ
đây là thứ bạn cần
Ầ Cảm ơn nhiều nhé Hẹn gặp lại
Ok Hẹn gặp lại
Trang 4Lê đình Thanh, Lập trình socket
Truyền thông giữa các ứng dụng
Ớ Nhiều ứng dụng có thể chạy ựồng thời trên một máy, sử
dụng cùng ựịa chỉ IP → Làm thế nào ựể phân biệt ựược
gói tin ựến gửi cho ứng dụng nào?
Ớ Giải pháp: Mỗi ứng dụng sử dụng một mã riêng biệt là một
số nguyên không âm ựược gọi là cổng (port)
Ớ Khi ứng dụng bên ngoài cần gửi cho ứng dụng B1, nó phải gửi cả IP của máy B và mã nhận diện của B1 trong gói dữ liệu.
Ớ Khi ứng dụng bên ngoài cần gửi cho ứng dụng B2, nó phải gửi cả IP của máy B và mã nhận diện của B2 trong gói dữ liệu.
Ớ IP:port - địa chỉ/ựịnh danh/socket của ứng dụng
8
Socket
Ớ IP:port - địa chỉ/ựịnh danh/socket của ứng dụng
Ớ Khi ứng dụng sử dụng cổng nào, nó sẽ ựăng ký với hệ ựiều hành
Ớ Nếu cổng ựã ựược sử dụng, hệ ựiều hành sẽ báo là không thể sử dụng ựược, ứng dụng sẽ dừng chạy hoặc xin cổng khác
Ớ Trong lập trình java:
Ớ Ứng dụng lắng nghe sử dụng ServerSocket và Socket
Ớ Ứng dụng khởi ựộng kết nối sử dụng Socket
Trang 5Lê đình Thanh, Lập trình socket
Lập trình socket
10
đối tượng Socket
Ớ Mỗi ựối tượng Socket có:
Ớ Một dòng ra: lưu dữ liệu sẽ gửi cho ựối tác nhưng chưa ựược gửi
Ớ Các phương thức gửi dữ liệu = ựưa dữ liệu ra dòng ra, ựẩy dữ liệu cho tầng giao vận (gửi)
Ớ Một dòng vào: lưu dữ liệu do ựối tác gửi ựến
Ớ Các phương thức nhận dữ liệu = ựọc dữ liệu từ dòng vào
Output
Sream
Input Stream
Network
Input
Stream
Socket
Output Sream
Socket TCP/UDP
Trang 6Lê đình Thanh, Lập trình socket
ServerSocket
//Tạo server socket lắng nghe trên cổng 8080
ServerSocket ssoc = new ServerSocket(8080);
//Chấp nhận kết nối
Socket soc = ssoc.accept();
12
Socket
//Tạo kết nối ựến server socket lắng nghe trên cổng 8080 ở máy
có IP 113.202.99.8
Socket soc = new Socket(Ộ113.202.99.8Ợ, 8080);
//Tham chiếu ựến dòng vào và dòng ra của socket
InputStream sin = soc.getInputStream();
OutputStream sout = soc.getOutputStream();
DataInputStream in = new DataInputStream(sin); DataOutputStream out = new DataOutputStream(sout);
//Gửi dữ liệu cho ựối tác
out.writeUTF(ỘNội dungỢ);
out.flush();
//đọc dữ liệu do ựối tác gửi ựến
String text = in.readUTF();
Trang 7Lê đình Thanh, Lập trình socket
Giao thức tầng ứng dụng
Ớ Một ứng dụng (B1) phải chạy trước, chờ xem có ứng dụng khác cần giao tiếp không
Ớ Ứng dụng cần giao tiếp (A1) thiết lập kết nối ựến ứng dụng
lắng nghe (B1)
thức)
Ớ A1/B1 cần kết thúc sẽ chào tạm biệt trước, B1/A1 sẽ tạm biệt lại
Ớ Giao thức cho ứng dụng cho biết thứ tự, kiểu nội dung các bước gửi/nhận của mỗi bên
14
Vắ dụ: Giao thức xưng danh
Ớ A xuất hiện
Ớ Tên tôi là A
Ớ Tôi sinh ngày 25/12/1990
Ớ Nhận lời chào
Ớ Kết thúc
Ớ B chờ người ựến
Ớ Vui lòng cho biết tên của bạn
Ớ Ghi nhận tên
Ớ Vui lòng cho biết ngày sinh của bạn
Ớ Ghi nhận ngày sinh
Ớ Xin chào A, sinh ngày 25/12/1990.
Ớ Kết thúc
Trang 8Lê đình Thanh, Lập trình socket
Phắa ghi danh (B)
//lang nghe tren cong 8080
ServerSocket ssoc = new ServerSocket(8080);
System.out.print("Running");
//chap nhan ket noi
Socket soc = ssoc.accept();
//tham chieu den cac dong vao va dong ra
InputStream sin = soc.getInputStream();
OutputStream sout = soc.getOutputStream();
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
//////////////////////////////// thuc hien giao thuc xung danh ////////////////////////////////
//yeu cau cho biet ten
out.writeUTF("Your name: ");
out.flush();
//ghi nhan ten
String name = in.readUTF();
//yeu cau cho biet ngay sinh
out.writeUTF("Your DOB: ");
out.flush();
//ghi nhan ngay sinh
String dob = in.readUTF();
//thong bao da ghi nhan xong
out.writeUTF("Welcome " + name + " whose DOB is " + dob + "\n");
out.flush();
//ket thuc
in.close();
out.close();
soc.close();
16
Lê đình Thanh, Lập trình socket
Phắa xưng danh (A)
//thiet lap ket noi
Socket soc = new Socket("127.0.0.1", 8080);
//tham chieu den cac dong vao va dong ra
InputStream sin = soc.getInputStream();
OutputStream sout = soc.getOutputStream();
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
//////////////////////////////// thuc hien giao thuc xung danh ///////////////////////////////////
//doc yeu cau (cho biet ten)
String text = in.readUTF();
System.out.print(text);
//mo mot input stream cho ban phim
Scanner scanner = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
scanner.useDelimiter("\n");
//nhap ten tu ban phim
String name = scanner.next();
//gui ten
out.writeUTF(name);
out.flush();
//doc yeu cau nhap ngay sinh
text = in.readUTF();
System.out.print(text);
//nhap ngay sinh tu ban phim
String dob = scanner.next();
//gui ngay sinh
out.writeUTF(dob);
out.flush();
//doc thong bao da ghi nhan
text = in.readUTF();
System.out.print(text);
Trang 9Lê đình Thanh, Lập trình socket
đa luồng (Multi-threading)
18
đa luồng
Ớ Một server có thể phải giao tiếp ựồng thời với nhiều clients
Ớ Với mỗi client, server phải chấp nhận một kết nối và thực hiện giao thức ứng dụng trên một luồng
Ớ → server phải tao nhiều luồng xử lý ựồng thời, mỗi luồng
thực hiện một kết nối ựến một client
Trang 10Lê đình Thanh, Lập trình socket
Phắa ghi danh Ờ Tạo luồng
public class MyThread extends Thread
{
private Socket soc;
public MyThread(Socket socket)
{
super("MyThread");
this.soc = socket;
}
Ầ
20
Phắa ghi danh Ờ Tạo luồng
public void run()
{
try {
//tham chieu den cac dong vao va dong ra
InputStream sin = soc.getInputStream();
OutputStream sout = soc.getOutputStream();
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
////////////// thuc hien giao thuc xung danh ///////////////////////
//yeu cau cho biet ten
out.writeUTF("Your name: ");
out.flush();
//ghi nhan ten
String name = in.readUTF();
//yeu cau cho biet ngay sinh
out.writeUTF("Your DOB: ");
out.flush();
//ghi nhan ngay sinh
String dob = in.readUTF();
//thong bao da ghi nhan xong
out.writeUTF("Welcome " + name + " whose DOB is " + dob + "\n");
out.flush();
//ket thuc
in.close();
out.close();
soc.close();
Trang 11Lê đình Thanh, Lập trình socket
Phắa ghi danh Ờ Chương trình chắnh
public static void main(String[] args) {
try
{
java.net.ServerSocket ssoc = new ServerSocket(8080);
System.out.print("Running");
int count = 0;
while (true)
{
Socket soc = ssoc.accept();
MyThread newthread = new MyThread(soc);
newthread.start();
count ++;
System.out.println("\nClient: " + count);
}
}
catch(Exception e)
{
System.out.print(e);
}
}
22
Tiếp theo
Triển khai ứng dụng