一、 填空題
- ___ IP地址____用來標志網絡中的一個通信實體的地址。通信實體可以是計算機,路由器等。
- 統一資源定位符URL是指向互聯網“資源”的指針,由4部分組成:協議、存放資源的主機域名、__端口___和資源路徑和文件名。
- URL 是統一資源定位器的簡稱,它表示Internet上某一資源的地址。
- 在Socket編程中,IP地址用來標志一台計算機,但是一台計算機上可能提供多種應用程序,使用 端口 來區分這些應用程序。
- 在Java Socket網絡編程中,開發基於TCP協議的服務器端程序使用的套接字是 ServerSocket 。
- 在Java Socket網絡編程中,開發基於UDP協議的程序使用的套接字是 DatagramSocket 。
二、 選擇題
1. |
以下協議都屬於TCP/IP協議棧,其中位於傳輸層的協議是( AD )。(選擇二項) |
|
|
|
|
|
A |
TCP |
|
B. |
HTTP |
|
C. |
SMTP |
|
D. |
UDP |
2. |
以下協議中屬於TCP/IP協議棧中應用層協議的是( A )。(選擇一項) |
|
|
|
|
|
A |
HTTP |
|
B. |
TCP |
|
C. |
UDP |
|
D. |
IP |
3. |
以下說法中關於UDP協議的說法正確的是( AD )。(選擇二項) |
|
|
|
|
|
A. |
發送不管對方是否准備好,接收方收到也不確認 |
|
B. |
面向連接 |
|
C. |
占用系統資源多、效率低 |
|
D. |
非常簡單的協議,可以廣播發送 |
4. |
在基於TCP網絡通信模式中,客戶與服務器程序的主要任務是( BC )。(選擇二項) |
|
|
|
|
|
A |
客戶程序在網絡上找到一條到達服務器的路由 |
|
B. |
客戶程序發送請求,並接收服務器的響應 |
|
C. |
服務器程序接收並處理客戶請求,然后向客戶發送響應結果 |
|
D. |
如果客戶程序和服務器都會保證發送的數據不會在傳輸途中丟失 |
5. |
在Java網絡編程中,使用客戶端套接字Socket創建對象時,需要指定( A )。(選擇一項) |
|
|
|
|
|
A |
服務器主機名稱和端口 |
|
B. |
服務器端口和文件 |
|
C. |
服務器名稱和文件 |
|
D. |
服務器地址和文件 |
6. |
ServerSocket的監聽方法accept( )方法的返回值類型是( A )。(選擇一項) |
|
|
|
|
|
A. |
Socket |
|
B. |
Void |
|
C. |
Object |
|
D. |
DatagramSocket |
7. |
Java UDP Socket編程主要用到的兩個類是( BD )。(選擇二項) |
|
|
|
|
|
A |
UDPSocket |
|
B. |
DatagramSocket |
|
C. |
UDPPacket |
|
D. |
DatagramPacket |
8. |
在使用UDP套接字通信時,常用( D )類把要發送的信息打包。(選擇一項) |
|
|
|
|
|
A |
String |
|
B. |
DatagramSocket |
|
C. |
MulticastSocket |
|
D. |
DatagramPacket |
三、 判斷題
- Socket是傳輸層供給應用層的編程接口,是應用層與傳輸層之間的橋梁 。( T )
- TCP/IP傳輸控制協議是Internet的主要協議,定義了計算機和外設進行通信的規則。TCP/IP網絡參考模型包括七個層次:應用層、會話層、表示層、傳輸層、網絡層、鏈路層和物理層。( F )
- TCP協議一種面向連接的、可靠的、基於字節流的通信協議 。HTTP、FTP、TELNET、SMTP 都是基於TCP協議的應用層協議。( T )
- UDP協議是一種面向無連接的、可靠的、基於字節流的傳輸層通信協議,該協議占用系統資源多、效率較低。( F )
四、 簡答題
- TCP/IP協議棧中,TCP協議和UDP協議的聯系和區別?
- 簡述基於TCP的Socket編程的主要步驟。
提示:分別說明服務器端和客戶端的編程步驟。
- 簡述基於UDP的Socket編程的主要步驟。
提示:分別說明服務器端和客戶端的編程步驟。
五、 編碼題
- 使用基於TCP的Java Socket編程,完成如下功能:
1) 要求從客戶端錄入幾個字符,發送到服務器端。
2) 由服務器端將接收到的字符進行輸出。
3) 服務器端向客戶端發出“您的信息已收到”作為響應。
4) 客戶端接收服務器端的響應信息。
提示:
服務器端:PrintWriter out =new PrintWriter(socket.getOutputStream(),true);
客戶端:BufferedReader line=new BufferedReader(new InputStreamReader(System.in));
服務器端:
1 public class Server 2 { // 服務器端類
3 private ServerSocket ss; // 聲明ServerSocket對象
4 private Socket socket; // 聲明Socket對象
5 private BufferedReader in; // 聲明輸入流對象BufferedReader
6 private PrintWriter out; // 聲明輸出流對象
7 public Server() 8 { 9 try
10 { 11 // 創建一個ServerSocket,指定等待端口
12 ss = new ServerSocket(10000); 13 while (true) 14 { 15 // 使用ServerSocket接收用戶請求(處於監聽狀態)
16 socket = ss.accept(); // 獲得客戶端的socket對象 17 // 創建輸入流並讀取信息
18 in = new BufferedReader(new InputStreamReader(socket 19 .getInputStream())); 20 String line = in.readLine(); 21 System.out.println("客戶端說:" + line); 22 // 創建輸出流並輸出信息
23 out = new PrintWriter(socket.getOutputStream(), true); 24 out.print("您的信息已接收!"); 25 // 關閉流和socket
26 out.close(); 27 in.close(); 28 socket.close(); 29 } 30 } catch (IOException e) 31 { 32 e.printStackTrace(); 33 out.println("出錯了!"); 34 } // 創建ServerSocket對象
35 } 36 public static void main(String[] args) 37 {// 程序主入口 38 // 創建對象
39 new Server(); 40 } 41 }
客戶端:(3分)
1 public class Client 2 { // 聲明客戶端類
3 Socket socket; // 聲明Socket對象
4 BufferedReader in; // 聲明輸入流對象
5 PrintWriter out; // 聲明輸出流對象
6 public Client() 7 { // 構造方法
8 try
9 { 10 // 創建Socket對象,用來發送請求
11 socket = new Socket(InetAddress.getLocalHost(), 10000); 12 // 創建字符緩沖區對象
13 BufferedReader line = new BufferedReader(new InputStreamReader( 14 System.in)); 15 // 創建輸出流對象並輸出
16 out = new PrintWriter(socket.getOutputStream(), true); 17 out.println(line.readLine()); 18 // 創建輸入流對象
19 in = new BufferedReader(new InputStreamReader(socket 20 .getInputStream())); 21 System.out.println(in.readLine()); 22 // 關閉流對象
23 out.close(); 24 in.close(); 25 } catch (Exception e) 26 { 27 e.printStackTrace(); 28 System.out.println("出錯了!"); 29 } 30 } 31 public static void main(String[] args) 32 { 33 // 創建對象
34 new Client(); 35 } 36 }
2. 使用基於UDP的Java Socket編程,完成在線咨詢功能:
1) 客戶向咨詢人員咨詢。
2) 咨詢人員給出回答。
3) 客戶和咨詢人員可以一直溝通,直到客戶發送bye給咨詢人員。
1 /**
2 * 3 * 在線客服咨詢人員 4 * 5 */
6 public class AskServer 7 { 8 public static void main(String[] args) 9 { 10 //創建DatagramSocket,發送接收數據都依賴他
11 DatagramSocket socket = null; 12 try
13 { 14 socket = new DatagramSocket(8888); 15 Scanner input = new Scanner(System.in); 16 while (true) 17 { 18 //准備一個空的數據包,用來接收數據
19 byte[] buf = new byte[1024]; 20 DatagramPacket packet = new DatagramPacket(buf, buf.length); 21 //接收數據使用空的數據包
22 socket.receive(packet); 23 //輸出信息
24 String info = new String(packet.getData(), 0, packet.getLength()); 25 System.out.println("客戶端請求:" + info); 26 //判斷是否退出
27 if ("bye".equals(info)) 28 { 29 break; 30 } 31 //發送數據
32 String result = input.nextLine(); 33 byte[] buf2 = result.getBytes(); 34 DatagramPacket packet2 = new DatagramPacket(buf2, buf2.length, 35 packet.getAddress(), packet.getPort()); 36 socket.send(packet2); 37 } 38 } catch (SocketException e) 39 { 40 e.printStackTrace(); 41 } catch (IOException e) 42 { 43 e.printStackTrace(); 44 } finally
45 { 46 //關閉socket
47 socket.close(); 48 } 49 } 50 }
1 /**
2 * 3 * 在線客服客戶 4 * 5 */
6 public class AskClient 7 { 8 public static void main(String[] args) 9 { 10 //創建DatagramSocket,發送接收數據都依賴他
11 DatagramSocket socket = null; 12 try
13 { 14 socket = new DatagramSocket(9999); 15 Scanner input = new Scanner(System.in); 16 while (true) 17 { 18 //准備要發送的數據
19 String str = input.nextLine();//bye 20 //使用數據包把數據封裝起來
21 byte[] buf = str.getBytes(); 22 DatagramPacket packet = new DatagramPacket(buf, buf.length, 23 InetAddress.getByName("192.168.1.252"), 8888); 24 //發送數據包
25 socket.send(packet); 26 //判斷是否退出
27 if ("bye".equals(str)) 28 { 29 break; 30 } 31 //接收數據
32 byte[] buf2 = new byte[1024]; 33 DatagramPacket packet2 = new DatagramPacket(buf2, buf2.length); 34 socket.receive(packet2); 35 System.out.println("服務器端反饋:"
36 + new String(packet2.getData(), 0, packet2.getLength())); 37 } 38 } catch (SocketException e) 39 { 40 e.printStackTrace(); 41 } catch (IOException e) 42 { 43 e.printStackTrace(); 44 } finally
45 { 46 //關閉socket
47 socket.close(); 48 } 49 } 50 }
六、 可選題
- 使用TCP網絡編程完成用戶登錄功能:客戶端輸入用戶名和密碼,向服務器發出登錄請求;服務器接收數據並進行判斷,如果用戶名和密碼均是bjsxt,則登錄成功,否則登錄失敗,返回相應響應信息;客戶端接收響應信息並輸出登錄結果。
1) 用戶User類已提供構造方法 public User(String username,String password)。
2) 客戶端采用ObjectOutputStream發送封裝了用戶名和密碼的User對象。
3) 服務器端和客戶端的類名和方法聲明如下所示。
public class LoginServer { public static void main(String[] args) throws Exception {} } public class LoginClient { public static void main(String[] args) throws Exception {} } |
1 public class LoginServer 2 { 3 public static void main(String[] args) throws Exception 4 { 5 // 1.創建一個ServerSocket,指定等待端口(1分)
6 ServerSocket serverSocket = new ServerSocket(8888); 7 // 2.使用ServerSocket接收用戶請求(處於監聽狀態)(1分)
8 Socket socket = serverSocket.accept(); 9 // 3.創建輸入流和輸出流(0.5分)
10 ObjectInputStream ois 11 = new ObjectInputStream(socket.getInputStream()); 12 DataOutputStream dos 13 = new DataOutputStream(socket.getOutputStream()); 14 // 4.接收用戶數據並輸出(0.5分)
15 User user = (User) ois.readObject(); 16 System.out.println("我是服務器,收到的信息是:" + user); 17 // 5.發送反饋信息(0.5分)
18 boolean flag = false; 19 if ("bjsxt".equals(user.getUsername()) 20 && "bjsxt".equals(user.getPassword())) 21 { 22 flag = true; 23 } 24 dos.writeBoolean(flag); 25 // 6.關閉流和socket(0.5分)
26 ois.close(); 27 dos.close(); 28 socket.close(); 29 } 30 }
1 public class LoginClient 2 { 3 public static void main(String[] args) throws Exception 4 { 5 // 1.創建Socket,用來發送請求(0.5分)
6 Socket socket 7 = new Socket(InetAddress.getByName("127.0.0.1"), 8888); 8 // 2.創建輸入流和輸出流(0.5分)
9 DataInputStream dis 10 = new DataInputStream(socket.getInputStream()); 11 ObjectOutputStream oos 12 = new ObjectOutputStream(socket.getOutputStream()); 13 // 3.發送數據(1分)
14 Scanner input = new Scanner(System.in); 15 System.out.println("請輸入用戶名"); 16 String username = input.nextLine(); 17 System.out.println("請輸入密碼"); 18 String password = input.nextLine(); 19 User user = new User(username, password); 20 oos.writeObject(user); 21 // 4.接收反饋信息並輸出(0.5分)
22 boolean flag = dis.readBoolean(); 23 if (flag) 24 { 25 System.out.println("登錄成功"); 26 } else
27 { 28 System.out.println("登錄失敗"); 29 } 30 // 5.關閉流和socket(0.5分)
31 dis.close(); 32 oos.close(); 33 socket.close(); 34 } 35 }