Tải bản đầy đủ (.doc) (34 trang)

báo cáo thực hành 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 (448.72 KB, 34 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA CÔNG NGHỆ THÔNG TIN

BỘ MÔN MẠNG VÀ TRUYỀN THÔNG






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

Nhóm
GV hướng dẫn

: 08A
: Nguyễn Văn Nguyên

Đà Nẵng 2011


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

MỤC LỤC
CHƯƠNG 1. CƠ SỞ LÝ THUYẾT......................................................................5
1.1. MÔ HÌNH CLIENT-SERVER: ......................................................................5
1.2. GIAO THỨC TCP....................................................................................6


1.3. GIAO THỨC UDP:..................................................................................6
CHƯƠNG 2. THIẾT KẾ VÀ XÂY DỰNG CHƯƠNG TRÌNH ..........................7
2.1. LAB1.................................................................................................... 8
2.1.1. Net1................................................................................................. 8
2.1.2. Student Manager..............................................................................9
2.1.3. NumberTCPSimple........................................................................13
2.2. LAB2.................................................................................................. 17
2.2.1. Net1............................................................................................... 17
2.2.2. Net2...............................................................................................18
2.2.3. Net3............................................................................................... 20
2.2.4. Net4............................................................................................... 21
2.2.5. KnockKnock..................................................................................23
2.3. LAB3.................................................................................................. 28
2.3.1. MulticastPeer.................................................................................28
2.3.2. Multicast........................................................................................30
CHƯƠNG 3. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ....................................35

4


Thực hành lập trình mạng
Chương 1.

GVHD: Nguyễn Văn Nguyên

CƠ SỞ LÝ THUYẾT

1.1. Mô hình client-server:
Mô hình client/server như sau: Client/Server là mô hình tổng quát nhất, trên thực tế
thì một server có thể được nối tới nhiều server khác nhằm làm việc hiệu quả và nhanh

hơn. Khi nhận được 1 yêu cầu từ client, server này có thể gửi tiếp yêu cầu vừa nhận
được cho server khác ví dụ như database server vì bản thân nó không thể xử lý yêu cầu
này được. Máy server có thể thi hành các nhiệm vụ đơn giản hoặc phức tạp. Ví dụ như
một máy chủ trả lời thời gian hiện tại trong ngày, khi một máy client yêu cầu lấy thông
tin về thời gian nó sẽ phải gửi một yêu cầu theo một tiêu chuẩn do server định ra, nếu
yêu cầu được chấp nhận thì máy server sẽ trả về thông tin mà client yêu cầu. Có rất
nhiều các dịch vụ server trên mạng nhưng nó đều hoạt động theo nguyên lý là nhận các
yêu cầu từ client sau đó xử lý và trả kết quả cho client yêu cầu. Thông thường chương
trình server và client được thi hành trên hai máy khác nhau. Cho dù lúc nào server
cũng ở trạng thái sẵn sàng chờ nhận yêu cầu từ client nhưng trên thực tế một tiến trình
liên tác qua lại (interaction) giữa client và server lại bắt đầu ở phía client, khi mà client
gửi tín hiệu yêu cầu tới server. Các chương trình server thường đều thi hành ở mức ứng
dụng (tầng ứng dụng của mạng). Sự thuận lợi của phương pháp này là nó có thể làm
việc trên bất cứ một mạng máy tính nào có hỗ trợ giao thức truyền thông chuẩn cụ thể
ở đây là giao thức TCP/IP. Với các giao thức chuẩn này cũng giúp cho các nhà sản
xuất có thể tích hợp nhiều sản phẩm khác nhau của họ lên mạng mà không gặp phải
khó khăn gì. Với các chuẩn này thì các chương trình server cho một dịch vụ nào đấy
có thể thi hành trên một hệ thống chia sẻ thời gian (timesharing system) với nhiều
chương trình và dịch vụ khác hoặc nó có thể chạy trên chính một máy tính các nhân
bình thường. Có thể có nhiều chương server cùng làm một dịch vụ, chúng có thể nằm
trên nhiều máy tính hoặc một máy tính. Với mô hình trên chúng ta nhận thấy rằng mô
hình client/server chỉ mang đặc điểm của phần mềm không liên quan gì đến phần cứng
mặc dù trên thực tế yêu cầu cho một máy server là cao hơn nhiều so với máy client. Lý
do là bởi vì máy server phải quản lý rất nhiều các yêu cầu từ các clients khác nhau trên
mạng. Ưu và nhược điểm chính Có thể nói rằng với mô hình client/server thì mọi thứ
dường như đều nằm trên bàn của người sử dụng, nó có thể truy cập dữ liệu từ xa (bao
gồm các công việc như gửi và nhận file, tìm kiếm thông tin, ...) với nhiều dịch vụ đa
dạng mà mô hình cũ không thể làm được. Mô hình client/server cung cấp một nền tảng
lý tưởng cho phép tích hợp các kỹ thuật hiện đại như mô hình thiết kế hướng đối
tượng, hệ chuyên gia, hệ thông tin địa lý (GIS) ... Một trong những vấn đề nảy sinh

trong mô hình này đó là tính an toàn và bảo mật thông tin trên mạng. Do phải trao đổi
dữ liệu giữa 2 máy ở 2 khu vực khác nhau cho nên dễ dàng xảy ra hiện tượng thông tin
truyền trên mạng bị lộ.

5


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

1.2. Giao thức TCP
Bộ giao thức TCP/IP, ngắn gọn là TCP/IP (tiếng Anh: Internet protocol
suite hoặc IP suite hoặc TCP/IP protocol suite - bộ giao thức liên mạng), là một bộ
các giao thức truyền thông cài đặt chồng giao thức mà Internet và hầu hết các mạng
máy tính thương mại đang chạy trên đó. Bộ giao thức này được đặt tên theo hai giao
thức chính của nó là TCP (Giao thức Điều khiển Giao vận) và IP (Giao thức Liên
mạng). Chúng cũng là hai giao thức đầu tiên được định nghĩa.
Như nhiều bộ giao thức khác, bộ giao thức TCP/IP có thể được coi là
một tập hợp các tầng, mỗi tầng giải quyết một tập các vấn đề có liên quan đến việc
truyền dữ liệu, và cung cấp cho các giao thức tầng cấp trên một dịch vụ được định
nghĩa rõ ràng dựa trên việc sử dụng các dịch vụ của các tầng thấp hơn. Về mặt lôgic,
các tầng trên gần với người dùng hơn và làm việc với dữ liệu trừu tượng hơn, chúng
dựa vào các giao thức tầng cấp dưới để biến đổi dữ liệu thành các dạng mà cuối cùng
có thể được truyền đi một cách vật lý.
- Mô hình OSI miêu tả một tập cố định gồm 7 tầng mà một số nhà sản xuất lựa
chọn và nó có thể được so sánh tương đối với bộ giao thức TCP/IP. Sự so sánh này có
thể gây nhầm lẫn hoặc mang lại sự hiểu biết sâu hơn về bộ giao thức TCP/IP.

1.3. Giao thức UDP:

UDP (User Datagram Protocol) là một trong những giao thức cốt lõi của giao
thức TCP/IP. Dùng UDP, chương trình trên mạng máy tính có thể gởi những dữ liệu
ngắn được gọi là datagram tới máy khác. UDP không cung cấp sự tin cậy và thứ tự
truyền nhận mà TCP làm; các gói dữ liệu có thể đến không đúng thứ tự hoặc bị mất mà
không có thông báo. Tuy nhiên UDP nhanh và hiệu quả hơn đối với các mục tiêu như
kích thước nhỏ và yêu cầu khắt khe về thời gian. Do bản chất không trạng thái của nó
nên nó hữu dụng đối với việc trả lời các truy vấn nhỏ với số lượng lớn người yêu cầu.
6


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

Những ứng dụng phổ biến sử dụng UDP như DNS (Domain Name System),
ứng dụng streaming media, Voice over IP, Trivial File Transfer Protocol (TFTP),
và game trực tuyến.

Chương 2.

THIẾT KẾ VÀ XÂY DỰNG CHƯƠNG
TRÌNH
7


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

2.1. LAB1

2.1.1.

Net1

Đề bài: Viết chương trình xử lí chuỗi nhập, dùng nó để khởi tạo đối tượng URL và
trả về thuộc tính của nó
Chức năng chương trình:
-

Truy cập vào URL, sau đó in các thông tin của tài nguyên như:
o Tên file
o Tên host
o Số hiệu cổng
o Kiểu giao thức (https hoặc http hoặc ftp…)

Cơ chế:
-

Client gửi yêu cầu đến SERVER

-

SERVER trả về thông tin tài nguyên

-

Client xuất ra console

Các lớp và chức năng các lớp:
-


Chương trình đơn giản nên chỉ có hàm main mà ko có các thuộc tính hay
phương thức

-

Khi biên dịch chạy người sử dụng truyền đối số vào, lúc đó chương trình sẽ
hiển thị các thông tin

-

Sử dụng lớp URL có sẵn để truy cập

Triển khai:
Net1.java
package Lab1;
import java.net.*;
public class Net1 {
public static void main(String args[]){
try{
URL u=new URL(":8080");
System.out.println("Name of the file is:"+ u.getFile());
System.out.println("Host name is:"+ u.getHost());
System.out.println("Port number is:"+ u.getPort());
System.out.println("Protocol type is:"+ u.getProtocol());
}catch(MalformedURLException e){
System.out.println(e);
8



Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

}
}
}
Kết quả:

2.1.2.

Student Manager

Đề bài: Tạo ra 2 ứng dụng độc lập. Ứng dụng đầu tiên nhận câu lệnh cho bảng
students có thuộc tính: name, id và age để thêm vào bảng. Còn ứng dụng thứ hai thì in
ra màn hình thông tin từ bảng students ở trên
Add Student
Chức năng chương trình:
-

Kết nối cơ sở dữ liệu

-

Thêm một trường vào cơ sở dữ liệu

Cơ chế:
-

Tạo kết nối đến Driver của hệ quản trị cơ sở dữ liệu


-

Từ đó, thực thi câu lệnh xử lí CSDL

-

Kiểm tra việc thêm có thành công hay ko, nếu ko thì báo lỗi

Các lớp và chức năng các lớp:
-

Cũng như lớp Net1, lớp này chứa hàm main, ko có thuộc tính và phương
thức gì khác

-

Tạo đối tượng Connection kết nối đến Driver của hệ quản trị CSDL, nếu
việc load driver không thành công thì thoát chương trình

-

Tạo đối tượng Statement thực thi câu lệnh xử lí CSDL (ở đây là Insert), sử
dụng phương thức execute để thực thi các lệnh không cần truy vấn, đối số
trả về là kiểu int, trả về 1 nếu thành công, và giá trị khác thì thất bại

Get Students1
Chức năng chương trình:
-


Kết nối CSDL

-

Truy vấn

1

9


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

Cơ chế:
-

Tạo kết nối đến Driver của hệ quản trị cơ sở dữ liệu

-

Từ đó, thực thi câu lệnh truy vấn CSDL

-

Xuất kết quả ra màn hình

Các lớp và chức năng các lớp:
-


Tương tự như lớp add student, khi tạo Statement thì sử dụng phương thức
excecuteQuery thay vì execute, kiểu trả về là ResultSet

-

Từ ResultSet đã trả về, hiển thị nó lên màn hình

Triển khai:
AddStudent.java
package Lab1;
import java.sql.*;
public class AddStudent {
public static void main(String args[]){
Connection connection=null;
try{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
}catch(Exception e){
System.out.println("Registering the Driver was failed");
}
try{
connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/
universitydb");
}catch(Exception e){
System.out.println("Connection with the DataBase failed");
e.printStackTrace();
System.exit(1);
}
Statement statement=null;
try{

statement=connection.createStatement();
boolean temp=statement.execute("insert into students value('Anh
Tuan,'012','06t3'");
//boolean temp=statement.execute("insert into students value('"+ args[0]
+ "','" + args[1]+ "','" + args[2]+ "')");
10


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

if(temp)System.out.println("a line was added to the table");
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
statement.close();
connection.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
GetStudent.java
package Lab1;
import java.sql.*;
public class GetStudent {
public static void main(String args[]){

Connection connection=null;
try{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
}catch(Exception e){
System.out.println("Registering the Driver was failed");
}
try{
connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/
universityDB");
}catch(Exception e){
System.out.println("Connection with the DataBase failed");
e.printStackTrace();
System.exit(1);
}
Statement statement=null;
try{
11


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

statement=connection.createStatement();
ResultSet result=statement.executeQuery("select * from student");
while(result.next()){
System.out.println(result.getString(1)+ "," + result.getString(2) + "," +
result.getString(3));
}
}catch(SQLException e){

e.printStackTrace();
}finally{
try{
statement.close();
connection.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
Kết quả:

12


Thực hành lập trình mạng

2.1.3.

GVHD: Nguyễn Văn Nguyên

NumberTCPSimple

Đề bài: Tạo ra hai ứng dụng độc lập (một client và một server). Client chấp nhận
một trong các số sau: 1, 2, 3. Số này sẽ được gửi đến server. Server sẽ trả lại tương ứng
: “ONE” hoặc “TWO” hoặc “THREE” (tùy theo số nhận được). Dùng giao thức
TCP/IP
Chức năng chương trình:
-


Client gửi số bất kì đến SERVER

-

Nếu là số 1,2,3 thì trả về ONE,TWO,THREE, các trường hợp còn lại trả về
UNKNOWN

Cơ chế:
-

SERVER mở cổng để client truy xuất đến

-

Tạo các luồng nhập xuất khi có client truy cập đến (cả client và SERVER),
lúc này client và server có thể gửi thông tin qua lại lẫn nhau

-

Client truy cập vào, sau đó gửi thông tin đến server

-

Server nhận được thông tin, rồi xử lí, sau đó gửi trả lại client

-

Client hiển thị thông tin mà server đã trả về


Các lớp và chức năng các lớp:
NumberTCPSimpleServer
-

Lớp này có phương thức go(), chức năng của nó:
o Mở cổng của server, tạo kết nối mỗi khi có client kết nối
o Chờ nhận dữ liệu từ Client gửi lên
o Xử lí dữ liệu
o Trả về client

-

Phương thức main của lớp này tạo ra đối tượng thuộc lớp
NumberTCPSimpleServer, sau đó gọi phương thức go() của lớp này

NumberTCPSimpleClient
-

Phương thức khởi tạo của lớp này có đối số là chuỗi về địa chỉ của server

-

Phương thức go():
o Tạo kết nối đến địa chỉ và số hiệu cổng của server
o Tạo các luồng nhập xuất liên kết với server
o Đưa dữ liệu cần gửi hoặc nhận vào các luồng này
o Gửi dữ liệu đến server
o Nhận dữ liệu (sau khi server đã xử lí) rồi hiển thị lên màn hình

Triển khai:

NumbersTCPSimpleClient.java
13


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

package Lab1.Cau3;
import java.io.*;
import java.net.*;
public class NumbersTCPSimpleClient {
public static final int DT_PORT=1300;
String hostName;
Socket soc;
public static void main(String args[]){
NumbersTCPSimpleClient client=new NumbersTCPSimpleClient("localhost");
try{
client.go("1");
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public NumbersTCPSimpleClient(String hostString){
this.hostName=hostString;
}
public void go(String str)throws IOException,ClassNotFoundException{
soc=new Socket(hostName,DT_PORT);

//creating an InputStream that will be connect to soc
InputStream is=soc.getInputStream();
//creating an ObjectInputStream object
ObjectInputStream ois=new ObjectInputStream(is);
//creating an OutputStream that will be connect to soc
OutputStream os=soc.getOutputStream();
//creating an ObjectOutputStream object
ObjectOutputStream oos=new ObjectOutputStream(os);
//sending data to server
oos.writeObject(str);
System.out.println(str+" was sent");
//receive from server
14


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

String temp=(String)ois.readObject();
System.out.println(temp+" was receive");
oos.close();
ois.close();
soc.close();
}
}
NumbersTCPSimpleServer .java
package Lab1.Cau3;
import java.io.*;
import java.net.*;

import java.util.*;
public class NumbersTCPSimpleServer {
private ServerSocket sSoc;
public static final int PORT=1300;
public static void main(String args[]){
NumbersTCPSimpleServer server=new NumbersTCPSimpleServer();
try{
server.go();
}catch(IOException e){
e.printStackTrace();
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public void go()throws IOException,ClassNotFoundException{
//creating a socket
Socket soc=null;
sSoc=new ServerSocket(PORT);
while(true){
System.out.println("I am the great server. Now I am waiting...");
soc=sSoc.accept();
System.out.println("I stopped writing. A Socket was instantiated");
15


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên


//creating an OutputStream object
OutputStream os=soc.getOutputStream();
//creating an ObjectOutputStream object
ObjectOutputStream oos=new ObjectOutputStream(os);
//creating an InputStream object
InputStream is=soc.getInputStream();
//creating an ObjectInputStream object
ObjectInputStream ois=new ObjectInputStream(is);
String receive=(String)ois.readObject();
String returned=null;
if(receive.equals("1"))
returned="ONE";
else
if(receive.equals("2"))
returned="TWO";
else
if(receive.equals("3"))
returned="THREE";
else
returned="UNKNOWN";
oos.writeObject(returned);
oos.close();
ois.close();
soc.close();
}
}
}
Kết quả:
Client


16


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

SERVER

2.2. LAB2
2.2.1.

Net1

Đề bài: Viết chương trình liệt kê toàn bộ nội dung của bất kì trang web nào trên net
Chức năng chương trình:
-

Hiển thị thông tin toàn bộ trang web của bất kì trang web nào dưới dạng
text đơn thuần

Cơ chế:
-

Gửi địa chỉ URL

-

Web server trả lại thông tin


-

Truy xuất đến thông tin cần thiết và hiển thị

Các lớp và chức năng các lớp:
-

Chỉ gồm một phương thức main:
o Liên kết đến URL với địa chỉ được nhập vào
o Sử dụng phương thức getContent() của đối tượng URL để nhận toàn
bộ nội dung của trang web
o Đọc toàn bộ nội dung và hiển thị lên màn hình

Triển khai:
net1.java
package Lab2;
17


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

import java.net.*;
import java.io.*;
public class net1 {
public static void main(String args[]){
int i;
BufferedInputStream bis;
try{

URL u=new URL("");
bis=new BufferedInputStream((InputStream)u.getContent());
while((i=bis.read())>0){
System.out.print((char)i);
//System.out.println();
}
}catch(MalformedURLException e){
System.out.println(e);
}
catch(IOException e){
System.out.println(e);
}
}
}
Kết quả:

2.2.2.

Net2

Đề bài: Viết chương trình gửi đến URL một chuỗi, mở kết nối từ URL này và hiển
thị thông tin header
Chức năng chương trình:
-

Mở kết nối đến địa chỉ URL

-

Hiển thị thông tin các header nhận được


Cơ chế:
18


Thực hành lập trình mạng

-

Truy xuất đến địa chỉ URL

-

Tạo kết nối đến nó

-

Lấy thông tin về Header

-

Hiển thị lên màn hình

GVHD: Nguyễn Văn Nguyên

Các lớp và chức năng các lớp:
-

Cũng chỉ có phương thức main:
o Tạo URL kết nối đến địa chỉ nhập vào

o Mở kết nối (sử dụng phương thức openConnection của đối tượng
URL)
o Lấy thông tin header (dùng phương thức getHeaderField,
getHeaderFieldKey của đối tượng URLconnection)
o Hiển thị thông tin header
o In thông báo lỗi nếu có lỗi xảy ra

Triển khai:
net2.java
package Lab2;
import java.net.*;
import java.io.*;
public class net2 {
public static void main(String args[]){
int i=1;
BufferedInputStream bis;
try{
URL ul=new URL("");
URLConnection u=ul.openConnection();
String s=u.getHeaderField(i);
String sg=u.getHeaderFieldKey(i);
while(s!=null){
System.out.println("Header "+i+": "+sg+" = "+s);
i++;
s=u.getHeaderField(i);
sg=u.getHeaderFieldKey(i);
}
}catch(MalformedURLException e){
19



Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

System.out.println(e);
}
catch(IOException e){
System.out.println(e);
}
}
}
Kết quả:

2.2.3.

Net3

Đề bài: Viết chương trình in ra địa chỉ của localhost (địa chỉ cục bộ), null host và
địa chỉ bất kì trên internet
Chức năng chương trình:
-

Hiển thị thông tin về địa chỉ cục bộ, địa chỉ null và địa chỉ bất kì trên
internet

Cơ chế:
Các lớp và chức năng các lớp:
-


Tạo đối tượng InetAddress

-

Sử dụng phương thức getLocalHost() để lấy thông tin về địa chỉ cục bộ và
hiển thị nó

-

Sử dụng phương thức getByName(null) để lấy thông tin về địa chỉ null và
hiển thị nó

-

Sử dụng phương thức getByName(URL) để lấy thông tin về địa chỉ URL
của một website và hiển thị nó

-

Hiện thị lỗi nếu có

Triển khai:
Net3.java
package Lab2;
20


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên


import java.io.*;
import java.net.*;
public class net3 {
public static void main(String args[]){
InetAddress i;
try{
i=InetAddress.getLocalHost();
System.out.println("The localhost is: "+ i);
i=InetAddress.getByName(null);
System.out.println("The Null host is: "+ i);
i=InetAddress.getByName("www.yahoo.com");
System.out.println("Yahoo Host address is: "+i);
}catch(IOException e){
System.out.println(e);
}
}
}
Kết quả:

2.2.4.

Net4

Đề bài: Viết chương trình mở kết nối dùng đối tượng URL và kiểm tra các thuộc
tính và nội dung của tài nguyên nhận được.
Chức năng chương trình:
-

Hiển thị các thông tin về tài nguyên nhận được trên internet như ngày tạo,

ngày chỉnh sửa sau cùng, ngày hết hạn…

Cơ chế:
Các lớp và chức năng các lớp:

21


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

-

Tương tự như Net3, thay vì sử dụng phương thức getHeaderField thì sử
dụng getDate(), getContentType()… của đối tượng URLConnection để thay
thế

-

Duyệt hết toàn bộ nội dung và hiển thị ra màn hình

Triển khai:
net4.java
package Lab2;
import java.net.*;
import java.io.*;
import java.util.*;
public class net4 {
public static void main(String args[])throws IOException{

int i;
URL ul=new URL("");
URLConnection u=ul.openConnection();
System.out.println("Date: "+ new Date(u.getDate()));
System.out.println("Content-type:"+u.getContentType());
System.out.println("Expires: "+u.getExpiration());
System.out.println("Last Modified: "+u.getLastModified());
int l=u.getContentLength();
System.out.println("Content_length: "+ l);
if(l>0){
System.out.println("Content");
InputStream is=u.getInputStream();
int a=l;
while(((i=is.read())!=-1)&&(--a>0)){
System.out.print((char)i);
}
is.close();
}
else
System.out.println("Content is not available");
}
}
22


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

Kết quả:


2.2.5.

KnockKnock

Đề bài:Viết ứng dụng để minh họa gửi dữ liệu đến server và client xử lí nó
Ví dụ hai chương trình độc lập chạy trên JAVA: chương trình client và chương
trình server. Chương trình client thực thi một lớp KnockKnockClient. Chương trình
server thực thi hai lớp: KnockKnockServer và KnockKnockProtocol.
KnockKnockServer chứa phương thức main cho chương trình server và mở cổng, kết
nối và đọc, gửi dữ liệu đến socket, còn KnockKnockProtocol xử lí jokes. Nó theo dõi
các joke hiện tại, trạng thái hiện tại (gửi knock knock, gửi clue, v.v…). và trả về giá trị
khác nhau của joke của trạng thái hiện tại. Đối tượng thực thi giao thức xác đinh –
ngôn ngữ giao tiếp giữa client và server
Chức năng chương trình:
-

Một chương trình vui nhộn, trao đổi thông điệp client-server qua lại lẫn
nhau, tựa như chat hoặc game

Cơ chế:
-

Dùng cơ chế client/server để gửi nhận thông điệp

Các lớp và chức năng các lớp:
-

Khi client và server kết nối với nhau thì Server sẽ hiển thị “Knock!Knock!”


-

Nếu người sử dụng gửi “Who’s there?”, server sẽ gửi tên hiện tại của người
đó trong chuỗi clues với chỉ số là currentJoke là chỉ số của người hiện tại

-

Nếu tiếp tục gửi tên của người hiện tại + who? (Tức là hỏi họ là ai), thì nó
kết hợp với chuỗi answers để trả lời cho client

-

Server sẽ hỏi có muốn tiếp tục không, nếu client đồng ý thì nó sẽ chuyển đến
người tiếp theo là người hiện hành, cứ như vậy cho đến khi người sử dụng
không muốn tiếp tục nữa

Triển khai:
KnockKnockServer.java
package Lab2.Cau5;
import java.io.*;
import java.net.*;
23


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

public class KnockKnockServer {
public static void main(String args[])throws IOException{

ServerSocket serverSocket=null;
try{
serverSocket=new ServerSocket(4444);
}catch(IOException e){
System.err.println("Could not listen on port: 4444");
System.exit(1);
}
Socket clientSocket=null;
try{
clientSocket=serverSocket.accept();
}catch(IOException e){
System.err.println("Accept failed");
System.exit(1);
}
PrintWriter out=new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader
InputStreamReader(clientSocket.getInputStream()));

in=new

BufferedReader(new

String inputLine,outputLine;
KnockKnockProtocol kkp=new KnockKnockProtocol();
outputLine=kkp.processInput(null);
out.println(outputLine);
while((inputLine=in.readLine())!=null){
outputLine=kkp.processInput(inputLine);
out.println(outputLine);
if(outputLine.equals("Bye!"))break;

}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
24


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

KnockKnockProtocol.java
package Lab2.Cau5;
public class KnockKnockProtocol {
private static final int WAITING=0;
private static final int SENTKNOCKKNOCK=1;
private static final int SENTCLUE=2;
private static final int ANOTHER=3;
private static final int NUMJOKES=5;
private int state=WAITING;
private int currentJoke=0;
private String []clues={"Turnip","Little Old Lady","Atch","Who","Who"};
private String []answers={"Turnip the heat, it's cold in here!","I didn't know you
could yodel!","Bless you!","Is there an owl in here?","Is there an echo in here?"};
public String processInput(String theInput){
String theOutput=null;
if(state==WAITING){

theOutput="Knock! Knock!";
state =SENTKNOCKKNOCK;
}
else if(state==SENTKNOCKKNOCK){
if(theInput.equalsIgnoreCase("Who's there?")){
theOutput=clues[currentJoke];
state=SENTCLUE;
}else theOutput="You're supposed to say \"Who there?\"!"+"Try again.
Knock! Knock!";
}
else if (state == SENTCLUE) {
if(theInput.equalsIgnoreCase(clues[currentJoke])){
theOutput=answers[currentJoke]+ "Want another? (y/n)";
state=ANOTHER;
}else{
theOutput="You're supposed to say \""+clues[currentJoke]+ " Who?\""+"!
Try again. Knock! Knock!";
state=SENTKNOCKKNOCK;
}
25


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

}
else if(state==ANOTHER){
if(theInput.equalsIgnoreCase("y")){
theOutput="Knock! Knock!";

if(currentJoke==NUMJOKES-1)
currentJoke=0;
else
currentJoke++;
state=SENTKNOCKKNOCK;
}else{
theOutput="Bye!";
state=WAITING;
}
}
return theOutput;
}
}
KnockKnockClient.java
package Lab2.Cau5;
import java.net.*;
import java.io.*;
public class KnockKnockClient {
public static void main(String args[])throws IOException{
Socket kkSocket=null;
PrintWriter out=null;
BufferedReader in=null;
try{
kkSocket=new Socket("localhost",4444);
out=new PrintWriter(kkSocket.getOutputStream(),true);
in=new

BufferedReader(new

InputStreamReader(kkSocket.getInputStream()));

}catch(UnknownHostException e){
System.err.println("Don't known about host: localhost");
System.exit(1);
26


Thực hành lập trình mạng

GVHD: Nguyễn Văn Nguyên

}catch(IOException e){
System.err.println("Couldn't get I/O for the connection to: localhost");
System.exit(1);
}
BufferedReader

stdIn=new

BufferedReader(new

InputStreamReader(System.in));
String fromServer;
String fromUser;
while((fromServer=in.readLine())!=null){
System.out.println("Server: "+ fromServer);
if(fromServer.equals("Bye!"))break;
fromUser=stdIn.readLine();
if(fromUser!=null){
System.out.println("Client: "+ fromUser);
out.print(fromUser);

}
}
out.close();
in.close();
stdIn.close();
kkSocket.close();
}
}
Kết quả:
SERVER

CLIENT

27


×