Tải bản đầy đủ (.pdf) (62 trang)

BÁO CÁO THỰC HÀNH Môn học: LẬP TRÌNH MẠNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.53 MB, 62 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN


BÁO CÁO THỰC HÀNH
Môn học:

LẬP TRÌNH MẠNG

Giáo viên hướng dẫn :
Sinh viên thực hiện :
Lớp
:
Mã sinh viên
:
Nhóm
:

Ths. NGUYỄN VĂN NGUYÊN
NGUYỄN ĐỨC VŨ
15T1
102150082
15.11A

Đà Nẵng, 01/2019


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên



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ũ

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 1


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A


GVHD: Th.s. Nguyễn Văn Nguyên

Page 2


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

MỤC LỤC
Nhóm

:

15.11A

LỜI NÓI ĐẦU ............................................... 0

BÀI THỰC HÀNH SỐ 1 ......................................................................................................... 5
1.

2.

3.

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

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

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.

2.

3.

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

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

Câu 3 ......................................................................................................................... 28
3.1.


Đề bài ................................................................................................................................ 28

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 3


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

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
Mã nguồn chương trình ................................................................................................ 35

1.

2.


-

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
Kết quả demo.............................................................................................................. 58

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 4


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

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

1.2.

Thuật toán

Chương trình server mở 1 socket, chờ nhận kết nối từ client, nếu có kết nối tạo
luồng Input để nhận dữ liệu và Ouput để trả về kết quả:
-

Nhận chuỗi

-


Hàm upCase(String): đọc từng ký tự, nếu tý tự trong khoảng a-z thì trừ 32,
trả về chuỗi in hoa

-

Hàm downCase(String): đọc từng ký tự, nếu trong khoảng A-Z thì cộng 32,
trả về chuỗi in thường

-

Hàm đếm số từ:
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

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 5


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

1.3.

GVHD: Th.s. Nguyễn Văn Nguyên

Mã nguồn chương trình
-

Server

public class Server {
public Server(){
try{
ServerSocket ss= new ServerSocket(9876);
System.out.print("Mo cong 9876 !");
Socket s= ss.accept();
System.out.print("Xuat hien ket noi !");
DataInputStream dis= new DataInputStream(s.getInputStream());

DataOutputStream dos= new
DataOutputStream(s.getOutputStream());
String str="";
while(true){
str= dis.readUTF();
if(str.equals("exit")) break;
dos.writeUTF(upCase(str));
dos.writeUTF(downCase(str));
dos.writeInt(count(str));
}
s.close();
ss.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
private String upCase(String str){
byte b[]= str.getBytes();
for(int i= 0; i< b.length; i++)
if(b[i]>='a'&&b[i]<='z') b[i]-=32;
return new String(b);
}
private String downCase(String str){
byte b[]= str.getBytes();
for(int i= 0; i< b.length; i++)
if(b[i]>='A'&&b[i]<='Z') b[i]+=32;
return new String(b);
}
private int count(String str){
s=s.trim();

s = s.replaceAll("\\s+"," ");
String[] tokens = s.split(" ");
int d=0;
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 6


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

for(int i=0;id++;
}
return d;
}
public static void main(String []args){
new Server();
}
}

-

Client:

public class Client {
public Client(){
try{
Scanner sc= new Scanner(System.in);

Socket s= new Socket("localhost", 9876);
DataOutputStream dos= new
DataOutputStream(s.getOutputStream());
DataInputStream dis= new DataInputStream(s.getInputStream());
String str="";
while(true){
System.out.print("Nhap chuoi can server xu ly: ");
str= sc.nextLine();
if(str.equals("exit")) break;
dos.writeUTF(str);
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();
}
}

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 7


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG


1.4.

GVHD: Th.s. Nguyễn Văn Nguyên

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ử +, -, (, ).

Ví dụ:
5+13-(12-4*6) –((3+4)-5)
Chương trình Server thực hiện tính toán và trả kết quả về cho Client

2.2.

Thuật toán

Chương trình server mở 1 socket, chờ nhận kết nối từ client, nếu có kết nối tạo
luồng Input để nhận dữ liệu và Ouput để trả về kết quả:
-

Nhận chuỗi biểu thức


-

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

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 8


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

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ề:


2.3.

-

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

-

In ra màn hình

Mã nguồn chương trình
-

Server:

public class Server {
public Server(){

try{
ServerSocket ss= new ServerSocket(9999);
System.out.println("Mo cong 9999 !");
Socket s= ss.accept();
System.out.println("Xuat hien ket noi !");
DataInputStream dis= new DataInputStream(s.getInputStream());
DataOutputStream dos= new
DataOutputStream(s.getOutputStream());
String str="";
while(true){
str= dis.readUTF();
if(str.equals("exit")) break;
dos.writeUTF(execute(str));
}
s.close();
ss.close();
}catch(Exception ex){
ex.printStackTrace();
}
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 9


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

}
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);
case '/':
if(bf==0) return "error";
return String.valueOf((float)af/bf);
default: return "error";
}
}
private int prio(char c){ //Tính độ ưu tiên của phép toán
if(c=='+'||c=='-') return 0;
if(c=='(') return 1;
if(c=='*'||c=='/') return 2;
return -1;
}
private String execute(String str){ //Tính toán kết quả
String v="";
Stack<String> numst= new Stack<String>();
Stack<Character> opest= new Stack<Character>();
String num="";
for(int i= 0; i< str.length(); i++){
char c= str.charAt(i);
switch(c){
default:
return "Error!";
case '0':case'1':case'2':case '3':case'4':case'5':case'6':case'7':case
'8':case'9':case'.':
num+=c;

if(i==(str.length()-1)){
if(!opest.isEmpty()){
numst.push(getValue(numst.pop(), opest.pop(),
num));
while(!opest.isEmpty()){
String n2= numst.pop(), n1=
numst.pop();
numst.push(getValue(n1, opest.pop(),
n2));
}
}else return num;
}
break;
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 10


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

case '+':case'-':
if(i==0){num+=c; break;}
case '*':case '/':case '(':
if(!num.equals("")){
numst.push(num);
num="";}
if(opest.isEmpty()){
opest.push(c);

}else{
if(c=='('){
opest.push(c);
break;
}
while(!opest.isEmpty()&&(opest.lastElement()!='(')&&prio(c)<=prio(opest.lastEleme
nt())){
String n2= numst.pop(), n1= numst.pop();
numst.push(getValue(n1, opest.pop(), n2));
}
opest.push(c);
}
break;
case ')':
if(!num.equals("")){
numst.push(num);
num="";}
while((!opest.isEmpty())&&opest.lastElement()!='('){
String n2= numst.pop(), n1= numst.pop();
numst.push(getValue(n1, opest.pop(), n2));
}
opest.pop();
}
}
while(!opest.isEmpty()){
String n2= numst.pop(), n1= numst.pop();
numst.push(getValue(n1, opest.pop(), n2));
}
v= numst.pop();
return v;

}
public static void main(String[]args){
new Server();
}
}

-

Client:

public class Client {
public Client(){
try{
Scanner sc= new Scanner(System.in);
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 11


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

Socket s= new Socket("localhost", 9999);
DataOutputStream dos= new
DataOutputStream(s.getOutputStream());
DataInputStream dis= new DataInputStream(s.getInputStream());
String str="";
while(true){
System.out.print("Nhap bieu thuc can tinh: ");

str= sc.nextLine();
if(str.equals("exit")) break;
dos.writeUTF(str);
System.out.println("Gia tri: "+dis.readUTF());
}
s.close();
}catch(Exception ex){
}
}
public static void main(String []args){
new Client();
}
}

2.4.

Kết quả demo

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
TCP/IP
-

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.
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 12


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

-

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>();
ServerSocket ss= null;
public Main(){
try{
ss= new ServerSocket(9999);

}catch(Exception ex){
}
this.start();
//Tiến trình lấy sms trong Queue gửi đến các client
Thread thr= new Thread(){
public void run(){
try {
while (true) {
Thread.sleep(0);
if(!Main.sms.isEmpty()){
String sms = Main.sms.poll();
for (int i = 0; i < Main.users.size(); i++)
{
User u = Main.users.get(i);
u.sendSMS(sms);
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 13


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên


}
}.start();
}
public void run(){ //Tiến trình chấp nhận kết nối và đẩy vào danh sách User
try{
while(true){
Socket s= ss.accept();
User u= new User(s);
u.start();
System.out.println(u.getUsername()+" da tham gia chat
room!");
users.addElement(u);
System.out.print(users.size());
}
}catch(Exception ex){
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(){
try{
while(true){
String t= dis.readUTF();
Main.sms.add(t);
}
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 14


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

}catch(Exception ex){
ex.printStackTrace();
}

}
public String getUsername(){
return name;
}
public void sendSMS(String str){
try{
dos.writeUTF(str);
}catch(Exception ex){
ex.printStackTrace();
}
}
}

-

Client.ChatRoom:

public class ChatRoom extends JFrame implements ActionListener, KeyListener,
Runnable{
JButton send;
JTextArea sms;
JTextField chat;
Socket s;
DataOutputStream dos= null;
DataInputStream dis= null;
Login login;
String name;
public ChatRoom(){
setTitle("");
setSize(600, 400);

setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout(0,5));
setLocationRelativeTo(null);
JPanel top= new JPanel();
top.add(new JLabel("Message: "));
add(top, BorderLayout.NORTH);
sms= new JTextArea(5, 10);
sms.setLineWrap(true);
sms.setWrapStyleWord(true);
sms.setEditable(false);
JScrollPane sp2= new JScrollPane(sms);
sp2.setAutoscrolls(true);
add(sp2, BorderLayout.CENTER);
JPanel bottom= new JPanel();
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 15


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

bottom.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 5));
bottom.add(new JLabel("Send SMS to all users: "));
chat= new JTextField(28);
chat.addKeyListener(this);
bottom.add(chat);
send= new JButton("Send");

send.addActionListener(this);
bottom.add(send);
add(bottom, BorderLayout.SOUTH);

setVisible(false);
login= new Login(this);
}
@Override
//Hàm xử lý sự kiện
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());
dos.writeUTF(name);
}catch(Exception ex){
login.setReport("Loi");
}
login.dispose();
this.setVisible(true);
this.setTitle(name);
new Thread(this).start();
}else if(click==send){
try {
dos.writeUTF(name+":"+chat.getText());
chat.setText("");
} catch (IOException ex) {

ex.printStackTrace();
}
}
}
@Override
public void keyPressed(KeyEvent ke) {
Component c = ke.getComponent();
if (c == chat) {
if (ke.getKeyCode() == 10){
try {
dos.writeUTF(name+":"+chat.getText());
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 16


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

} 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
}
public static void main(String []args){
new ChatRoom();
}
@Override
public void run() {
try {
while(true){
sms.append(dis.readUTF()+"\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

-

Client.Login:

public class Login extends JFrame{
private ChatRoom cr;
private JTextField name;
public JButton login;
private JLabel report= new JLabel("");
public Login(ChatRoom cr){

this.cr= cr;
setTitle("Login");
setSize(300, 200);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(4,1));
setLocationRelativeTo(null);
JPanel top = new JPanel();
top.add(new JLabel("Enter your nickname to connect!"));
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 17


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

add(top);
JPanel middle1= new JPanel();
name= new JTextField(15);
middle1.add(name);
add(middle1);
JPanel middle2= new JPanel();
middle2.add(report);
add(middle2);
JPanel bottom= new JPanel();
login= new JButton("Login");
login.addActionListener(cr);
bottom.add(login);

add(bottom);
setVisible(true);
report.setFont(new Font("Times New Roman", Font.ITALIC, 20));
report.setForeground(Color.RED);
}
public void setReport(String str){
report.setText(str);
}
public String getUserName(){
return (name.getText().equals(""))?"Unknow name":name.getText();
}
}

3.4.

Kết quả demo

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 18


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

GVHD: Th.s. Nguyễn Văn Nguyên

Page 19



BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

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
+ Đếm số từ của chuỗi đã gửi.

1.2.

Thuật toán

Chương trình server mở DatagramSocket, chờ nhận Packet từ client, nếu có
Packet đến, nhận dữ liệu chứa trong Packet và trả về Packet chứa kết quả

-

Nhận chuỗi

-

Hàm upCase(String): đọc từng ký tự, nếu tý tự trong khoảng a-z thì trừ 32,
trả về chuỗi in hoa

-

Hàm downCase(String): đọc từng ký tự, nếu trong khoảng A-Z thì cộng 32,
trả về chuỗi in thường

-

Hàm đếm số từ:
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

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 20


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

1.3.
-

GVHD: Th.s. Nguyễn Văn Nguyên

Mã nguồn chương trình
Server:

public class Server {
public Server(){
try{
DatagramSocket ds= new DatagramSocket(1995);
DatagramPacket dp;

while(true){
byte[] rece= new byte[1024];
dp= new DatagramPacket(rece, 1024);
String str;
ds.receive(dp);
str= new String(dp.getData()).substring(0, dp.getLength());
System.out.println("Da nhan chuoi: "+str);
String str2= upCase(str);
dp= new DatagramPacket(str2.getBytes(), str2.length(),
dp.getAddress(), dp.getPort());
ds.send(dp);
System.out.println("Da gui chuoi HOA! ");
str2= downCase(str);
dp= new DatagramPacket(str2.getBytes(), str2.length(),
dp.getAddress(), dp.getPort());
ds.send(dp);
System.out.println("Da gui chuoi thuong! ");
str2= String.valueOf(count(str));
dp= new DatagramPacket(str2.getBytes(), str2.length(),
dp.getAddress(), dp.getPort());
ds.send(dp);
System.out.println("Da gui so tu! ");
}
}catch(Exception ex){
}
}
private String upCase(String str){
byte b[]= str.getBytes();
for(int i= 0; i< b.length; i++)
if(b[i]>='a'&&b[i]<='z') b[i]-=32;

return new String(b);
}
private String downCase(String str){
byte b[]= str.getBytes();
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 21


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

for(int i= 0; i< b.length; i++)
if(b[i]>='A'&&b[i]<='Z') b[i]+=32;
return new String(b);
}
private int count(String str){
int c=0;
byte f= 0;
byte b[]= str.getBytes();
for(int i= 0; iif(f==0&&b[i]!=' '){
f= 1; c+= f;
}else if(f==1&&b[i]==' ') f= 0;
}
return c;
}
public static void main(String []args){
new Server();

}
}

-

Client

public class Client {
public Client(){
try{
Scanner sc= new Scanner(System.in);
String str="";
DatagramSocket ds= new DatagramSocket();
DatagramPacket dp;
while(true){
System.out.print("Nhap chuoi can server xu ly: ");
str= sc.nextLine();
if(str.equals("exit")) break;
//Gửi chuổi đến server
dp= new DatagramPacket(str.getBytes(), str.length(),
InetAddress.getByName("localhost"), 1995);
ds.send(dp);
System.out.println("Da gui chuoi !");
String str2;
//Nhận lại chuỗi hoa
ds.receive(dp);
str2= new String(dp.getData()).substring(0,
dp.getLength());
System.out.println("Chuoi hoa: "+str2);
//Nhận lại chuỗi thường

ds.receive(dp);
SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 22


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

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){
new Client();
}
}

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 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ử +, -, (, ).
Ví dụ:
5+13-(12-4*6) –((3+4)-5)
Chương trình Server thực hiện tính toán và trả kết quả về cho Client

2.2.

Thuật toán

+ Chương trình server mở 1 DatagramSocket, chờ nhận Packet từ client, nếu có
Packet chứ dữ liệu đến, lấy dữ liệu xử lý mà đưa vào Packet trả về lại client
-

Nhận chuỗi biểu thức

-

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.

SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 23


BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG

GVHD: Th.s. Nguyễn Văn Nguyên

+ 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

In ra màn hình

2.3.
-

Mã nguồn chương trình
Server:

public class Server {
public Server(){
try{
DatagramSocket ds= new DatagramSocket(1995);
DatagramPacket dp;
while(true){
byte[] rece= new byte[1024];
dp= new DatagramPacket(rece, 1024);
String str;
//Nhận chuỗi từ máy khách
ds.receive(dp);
str= new String(dp.getData()).substring(0, dp.getLength());
System.out.println("Da nhan chuoi: "+str);
String str2= execute(str);


SVTH: Nguyễn Đức Vũ-15T1-15Nh11A

Page 24


×