Chường trình client kết nối đến socket của server vừa mở, tạo luồng Output để gửi dữ liệu và Input để nhận kết quả trả về: - Nhập chuỗi từ bàn phím - Gửi chuỗi đến server - Nhận về 2 chu
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
Trang 2SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 1
LỜI NÓI ĐẦU Lập trình mạng là một trong những nhiệm vụ quan trong trong việc phát triển các ứng dụng doanh nghiệp Một chương trình mạng được viết ra để các chương trình trên các máy tính khác nhau có thể truyền tin với nhau một cách hiệu quả và an toàn cho dù chúng được cài đặt trên mạng LAN, WAN hay mạng toàn cầu Internet, đây là điều căn bản đối với sự thành công của nhiều hệ thông Java là ngôn ngữ lập trình hướng đối tượng thuần thúy với nhiều đặc trưng ưu việt so với các ngôn ngữ lập trình hướng đối tượng khác như tính độc lập với nền, tính bảo mật,… Java là ngôn ngữ ngay
từ khi ra đời đã hướng đến lập trình mạng nên việc viết một chương trình lập trình mạng bằng Java dễ dàng hơn nhiều so với các ngôn ngữ khác
Bên cạnh phần lý thuyết của Lập trình mạng, học phần Thực hành Lập trình mạng giúp sinh viên được tiếp cận với cách lập trình trên môi trường mạng sử dụng ngôn ngữ JAVA Với sự hướng dẫn của thầy Nguyễn Văn Nguyên, em đã biết cách viết một chương trình mạng cơ bản, em xin chân thành cảm ơn thầy đã hướng dẫn em trong suốt quá trình học
Sinh viên thực hiện
Nguyễn Đức Vũ
Trang 3SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 2
Trang 4SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 3
MỤC LỤC
Nhóm : 15.11A LỜI NÓI ĐẦU 0
BÀI THỰC HÀNH SỐ 1 5
1 Bài 1 5
1.1 Đề bài 5
1.2 Thuật toán 5
1.3 Mã nguồn chương trình 6
1.4 Kết quả demo 8
2 Câu 2 8
2.1 Đề bài 8
2.2 Thuật toán 8
2.3 Mã nguồn chương trình 9
2.4 Kết quả demo 12
3 Câu 3 12
3.1 Đề bài 12
3.2 Thuật toán 12
3.3 Mã nguồn chương trình 13
3.4 Kết quả demo 18
BÀI THỰC HÀNH SỐ 2 20
1 Câu 1 20
1.1 Đề bài 20
1.2 Thuật toán 20
1.3 Mã nguồn chương trình 21
1.4 Kết quả demo 23
2 Câu 2 23
2.1 Đề bài 23
2.2 Thuật toán 23
2.3 Mã nguồn chương trình 24
2.1 Kết quả demo 27
3 Câu 3 28
3.1 Đề bài 28
Trang 5SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 4
3.2 Thuật toán 28
3.3 Mã nguồn chương trình 28
3.4 Kết quả demo 34
BÀI THỰC HÀNH SỐ 3 35
Đề bài 35
1 Mã nguồn chương trình 35
- style.css 35
- header.jsp 39
- bodyleft.jsp 42
- login.jsp 46
- checklogin.jsp 48
- index.jsp 48
- xemnhanvien.jsp 49
- xemphongban.jsp 50
- suathongtinphongban.jsp 51
- suachitiet.jsp 53
- timkiem.jsp 55
- xemchitiet.jsp 56
2 Kết quả demo 58
Trang 6SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 5
BÀI THỰC HÀNH SỐ 1
1 Bài 1
1.1 Đề bài
Xây dựng chương trình hội thoại Client/Server hoạt động theo giao thức TCP/IP
- Chương trình Server mở cổng và chờ nhận kết nối từ Client
- Client gửi một chuỗi ký tự đến Server Server nhận và xử lý gửi trả về cho client các công việc:
+ Đổi chuỗi đã gửi thành chuỗi in hoa + Đổi chuỗi đã gửi thành chuỗi thường + Đếm số từ của chuỗi đã gửi
Sử dụng hàm Trim() để xóa các khoảng trắng ở trước và sau từ, sau đó nêu
có các khoảng trắng liên tiếp nhau thì xóa đi, ta thu được chuổi str
Khai báo 1 biến đếm d khởi tạo bằng 0;
Sử dụng split(" ") ta thu được mảng b[] có số phần tử chính là số từ của chuỗi cho vòng for chạy từ 0 tới b.lengh rồi cho d++;
d chính là số từ của chuỗi
Chường trình client kết nối đến socket của server vừa mở, tạo luồng Output để gửi
dữ liệu và Input để nhận kết quả trả về:
- Nhập chuỗi từ bàn phím
- Gửi chuỗi đến server
- Nhận về 2 chuỗi: HOA, thường và số từ của chuỗi
- In ra màn hình
Trang 7SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 6
System.out.print("Xuat hien ket noi !");
DataInputStream dis= new DataInputStream(s.getInputStream()); DataOutputStream dos= new
Trang 8SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 7
Scanner sc= new Scanner(System.in);
Socket s= new Socket("localhost", 9876);
DataOutputStream dos= new DataOutputStream(s.getOutputStream());
DataInputStream dis= new DataInputStream(s.getInputStream());
System.out.println("Chuoi hoa: "+dis.readUTF());
System.out.println("Chuoi thuong: "+dis.readUTF()); System.out.println("So tu: "+dis.readInt());
} s.close();
}catch(Exception ex){
} }
public static void main(String []args){
new Client();
}
}
Trang 9SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 8
1.4 Kết quả demo
2 Câu 2
2.1 Đề bài
Xây dựng chương trình hội thoại Client/Server hoạt động theo giao thức TCP/IP
- Chương trình Client cho phép nhập vào từ bàn phím một chuỗi biễu diễn một phép tính gồm các toán tử +, -, (, )
- Xử lý chuỗi biểu thức theo thuật toán Balan để lấy kết quả
+ Duyệt từng ký tự của chuỗi
+ Nếu là số thì cộng dồn rồi đẩy vào numStack (number stack), nếu là kí tự (+ - * / ( )) thì đẩy vào opeStack (operator stack)
+ Nếu phép toán đang duyệt có mức ưu tiên thấp hơn phép toán ở đỉnh opeStack thì lấy phép toán trong stack ra cùng với 2 giá trị đầu trong
Trang 10SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 9
numStack tính toán và đưa giá trị tính được vào lại numStack, sau đó đưa phép toán đang duyệt vào opeStack
+ Nếu gặp ‘)’ thì lấy lần lượt giá trị cùng phép toán trong numStack, opeStack tính toán cho đến khi lấy ra được ( thì đưa giá trị tính được vào lại numStack và xóa ‘(‘ trong opeStack đi
+ Tiếp tục như vậy thì cuối cùng giá trị còn lại trong numStack là giá trị của biểu thức
+ Trả kết quả tính được về cho client
Chường trình client kết nối đến socket của server vừa mở, tạo luồng Output để gửi
dữ liệu và Input để nhận kết quả trả về:
- Nhập chuỗi biểu thức từ bàn phím
- Kiểm tra nếu chuỗi chứa các ký tự khác (1,2,….,9 , (,),+,-,*,/ ) thì cho người dùng nhập lại
- Gửi biểu thức đến server
- Nhận về kết quả của biểu thức
System.out.println("Xuat hien ket noi !");
DataInputStream dis= new DataInputStream(s.getInputStream()); DataOutputStream dos= new
ss.close();
}catch(Exception ex){
ex.printStackTrace();
}
Trang 11SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 10
}
private String getValue(String a, char o, String b){ //Giá trị của một phép toán
float af= Float.valueOf(a), bf= Float.valueOf(b);
switch(o){
case '+': return String.valueOf(af+bf);
case '-': return String.valueOf(af-bf);
case '*': return String.valueOf(af*bf);
private int prio(char c){ //Tính độ ưu tiên của phép toán
Stack<String> numst= new Stack<String>();
Stack<Character> opest= new Stack<Character>();
while(!opest.isEmpty()){
String n2= numst.pop(), n1=
numst.pop();
numst.push(getValue(n1, opest.pop(), n2));
} }else return num;
} break;
Trang 12SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 11
String n2= numst.pop(), n1= numst.pop();
numst.push(getValue(n1, opest.pop(), n2)); }
opest.push(c);
} break;
} }
while(!opest.isEmpty()){
String n2= numst.pop(), n1= numst.pop();
numst.push(getValue(n1, opest.pop(), n2));
} v= numst.pop();
Trang 13SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 12
Socket s= new Socket("localhost", 9999);
DataOutputStream dos= new DataOutputStream(s.getOutputStream());
DataInputStream dis= new DataInputStream(s.getInputStream());
}catch(Exception ex){
} }
public static void main(String []args){
- Chương trình Server mở cổng chờ nhận kết nối từ Client
- Chương trình Client kết nối và thực hiện trao đổi với chương trình Server
3.2 Thuật toán
Chương trình server mở kết nối ở 1 cổng socket và sẵn sàng nhận kết nối từ bất kì client nào, nếu có kết nối đến thì sẽ xuất hiện thông báo username đã vào chat room ở màn hình
Trang 14SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 13
- Server sẽ chấp nhận kết nối của client
- Tạo 1 tiến trình nhận sms của 1 client gửi về (class User), đẩy tiến trình vào danh sách kết nối
- Tiến trình vừa tạo sẽ nhận sms và đưa sms vào 1 hàng đợi (Queue)
- Mặt khác, server có 1 tiến trình lấy tất cả sms trong hàng đợi gửi về cho tất
cả các client trong danh sách
- Sms gồm có tên user của client và nội dung được gửi
Chương trình Client nhập vào username từ giao diện Login để kết nối đến Server, nếu kết nối thành công thì giao diện Login biến mất và hiện lên chat room, chat room hiển thị tất cả những sms của các client gửi đến server Từ giao diện chat room có thể gửi sms đến các client khác
3.3 Mã nguồn chương trình
- Server.Main:
public class Main extends Thread{
public static Vector<User> users= new Vector<User>();
public static Queue<String> sms= new LinkedList<String>();
//Tiến trình lấy sms trong Queue gửi đến các client
Thread thr= new Thread(){
public void run(){
} } catch (Exception ex) {
ex.printStackTrace();
}
Trang 15SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 14
} }.start();
ex.printStackTrace();
} }
public static void main(String []args){
new Main();
}
}
- Server.User //Tiến trình nhận sms và gửi sms với 1 client
public class User extends Thread{
Socket s;
DataOutputStream dos= null;
DataInputStream dis= null;
String name= null;
public User(Socket s){
this.s= s;
try{
dos= new DataOutputStream(s.getOutputStream());
dis= new DataInputStream(s.getInputStream());
name= dis.readUTF();
}catch(Exception ex){
ex.printStackTrace();
} }
public void run(){
Trang 16SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 15
}catch(Exception ex){
ex.printStackTrace();
} }
public String getUsername(){
DataOutputStream dos= null;
DataInputStream dis= null;
Trang 17SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 16
bottom.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 5));
bottom.add(new JLabel("Send SMS to all users: "));
chat= new JTextField(28);
public void actionPerformed(ActionEvent e) {
Object click= e.getSource();
if(click==login.login){
name= login.getUserName();
try{
s= new Socket("localhost", 999);
dos= new DataOutputStream(s.getOutputStream());
dis= new DataInputStream(s.getInputStream());
Trang 18SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 17
} catch (IOException e) {
e.printStackTrace();
} chat.setText("");
}
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
e.printStackTrace();
} }
}
- Client.Login:
public class Login extends JFrame{
private ChatRoom cr;
private JTextField name;
public JButton login;
private JLabel report= new JLabel("");
JPanel top = new JPanel();
top.add(new JLabel("Enter your nickname to connect!"));
Trang 19SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 18
add(top);
JPanel middle1= new JPanel();
name= new JTextField(15);
JPanel bottom= new JPanel();
login= new JButton("Login");
public String getUserName(){
return (name.getText().equals(""))?"Unknow name":name.getText();
}
}
3.4 Kết quả demo
Trang 20SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 19
Trang 21SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 20
BÀI THỰC HÀNH SỐ 2
1 Câu 1
1.1 Đề bài
Xây dựng chương trình hội thoại Client/Server hoạt động theo giao thức UDP
- Chương trình Server mở cổng và chờ nhận kết nối từ Client
- Client gửi một chuỗi ký tự đến Server Server nhận và xử lý gửi trả về cho client các công việc:
+ Đổi chuỗi đã gửi thành chuỗi in hoa + Đổi chuỗi đã gửi thành chuỗi thường
Khai báo 1 biến cờ f= 0, 1 biến đếm c= 0;
Đọc từng ký tự: nếu f=0 và ký tự khác space thì f=1 và c++; nếu f=1 và ký tự
là space thì f=0
Trả về giá trị của c
Chường trình client kết nối đến socket của server vừa mở, tạo luồng Output để gửi
dữ liệu và Input để nhận kết quả trả về:
- Nhập chuỗi từ bàn phím
- Gửi chuỗi đến server
- Nhận về 2 chuỗi: HOA, thường và số từ của chuỗi
- In ra màn hình
Trang 22SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 21
str= new String(dp.getData()).substring(0, dp.getLength());
System.out.println("Da nhan chuoi: "+str);
} }
private String upCase(String str){
Trang 23SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 22
for(int i= 0; i< b.length; i++)
//Gửi chuổi đến server
dp= new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("localhost"), 1995);
System.out.println("Chuoi hoa: "+str2);
//Nhận lại chuỗi thường
ds.receive(dp);
Trang 24SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 23
str2= new String(dp.getData()).substring(0, dp.getLength());
System.out.println("Chuoi thuong: "+str2);
//Nhận lại số từ
ds.receive(dp);
str2= new String(dp.getData()).substring(0, dp.getLength());
System.out.println("So tu: "+Integer.valueOf(str2));
} }catch(Exception ex){
ex.printStackTrace();
} }
public static void main(String []args){
Xây dựng chương trình hội thoại Client/Server hoạt động theo giao thức UDP
- Chương trình Client cho phép nhập vào từ bàn phím một chuỗi biễu diễn một phép tính gồm các toán tử +, -, (, )
- Xử lý chuỗi biểu thức theo thuật toán Balan để lấy kết quả
+ Duyệt từng ký tự của chuỗi
Trang 25SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 24
+ Nếu là số thì cộng dồn rồi đẩy vào numStack (number stack), nếu là kí tự (+ - * / ( )) thì đẩy vào opeStack (operator stack)
+ Nếu phép toán đang duyệt có mức ưu tiên thấp hơn phép toán ở đỉnh opeStack thì lấy phép toán trong stack ra cùng với 2 giá trị đầu trong numStack tính toán và đưa giá trị tính được vào lại numStack, sau đó đưa phép toán đang duyệt vào opeStack
+ Nếu gặp ‘)’ thì lấy lần lượt giá trị cùng phép toán trong numStack, opeStack tính toán cho đến khi lấy ra được ( thì đưa giá trị tính được vào lại numStack và xóa ‘(‘ trong opeStack đi
+ Tiếp tục như vậy thì cuối cùng giá trị còn lại trong numStack là giá trị của biểu thức
+ Trả kết quả tính được về cho client
Chường trình client gửi Packet chứ dữ liệu cần xử lý đến Socket của server vừa
mở và chờ nhận Packet chứa kết quả trả về từ Server
- Nhập chuỗi biểu thức từ bàn phím
- Gửi biểu thức đến server
- Nhận về kết quả của biểu thức
str= new String(dp.getData()).substring(0, dp.getLength());
System.out.println("Da nhan chuoi: "+str);
String str2= execute(str);
Trang 26SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 25
//Trả về giá trị cho máy khách
dp= new DatagramPacket(str2.getBytes(), str2.length(), dp.getAddress(), dp.getPort());
ds.send(dp);
System.out.println("Da gui gia tri bieu thuc! ");
} }catch(Exception ex){
ex.printStackTrace();
} }
private String getValue(String a, char o, String b){
float af= Float.valueOf(a), bf= Float.valueOf(b);
switch(o){
case '+': return String.valueOf(af+bf);
case '-': return String.valueOf(af-bf);
case '*': return String.valueOf(af*bf);
private int prio(char c){
Stack<String> numst= new Stack<String>();
Stack<Character> opest= new Stack<Character>();
Trang 27SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 26
while(!opest.isEmpty()){
String n2= numst.pop(), n1=
numst.pop();
numst.push(getValue(n1, opest.pop(), n2));
} }else return num;
} break;
String n2= numst.pop(), n1= numst.pop();
numst.push(getValue(n1, opest.pop(), n2)); }
opest.push(c);
} break;
} }
while(!opest.isEmpty()){
String n2= numst.pop(), n1= numst.pop();
numst.push(getValue(n1, opest.pop(), n2));
} v= numst.pop();
return v;
}
Trang 28SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 27
public static void main(String[]args){
//Gửi biểu thức đến server
dp= new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("localhost"), 1995);
System.out.println("Gia tri bieu thuc: "+str2);
} }catch(Exception ex){
} }
public static void main(String []args){
new Client();
}
}
2.1 Kết quả demo
Trang 29SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 28
3 Câu 3
3.1 Đề bài
Xây dựng chương trình hội thoại chat room Client/Server hoạt động theo giao thức UDP
- Chương trình Server mở cổng chờ nhận kết nối từ Client
Chương trình Client kết nối và thực hiện trao đổi với chương trình Server
3.2 Thuật toán
3.3 Mã nguồn chương trình
- Server.Main:
public class Main extends Thread{
public static Vector<User> users= new Vector<User>();
public static Queue<String> sms= new LinkedList<String>();
public static DatagramSocket ds;
//Tiến trình gửi sms cho tất cả các client
Thread thr= new Thread(){
public void run(){
Trang 30SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 29
u.sendSMS(sms);
} }
} } catch (Exception ex) {
ex.printStackTrace();
} }
}catch(Exception ex){
ex.printStackTrace();
} }
public static void main(String []args){
new Main();
}
}
- Server.User
//Lớp lưu trữ các thông tin của 1 client: tên, địa chỉ, cổng
public class User{
InetAddress ia= null;
Trang 31SVTH: Nguyễn Đức Vũ-15T1-15Nh11A Page 30