網絡編程作業
一、 填空題
- ______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/IP雖然名字是TCP,但是他的傳輸層包含TCP和UDP兩個協議
TCP是Tranfer ControlProtocol的簡稱,是一種面向連接的保證可靠傳輸的協議。
UDP是UserDatagram Protocol的簡稱,是一種無連接的協議,每個數據報都是一個獨立的信息
TCP:
優點:1、面向連接的傳輸;2、數據傳輸穩定可靠;3、端到端的通信;4、全雙工方式;5、以字節為單位傳輸
缺點:傳輸速度不夠快
UDP:
優點:1、傳輸速度快;2、效率高;
缺點:數據包可能會丟失
- 簡述基於TCP的Socket編程的主要步驟。
提示:分別說明服務器端和客戶端的編程步驟。
在Socket的程序開發中,服務器端使用ServerSocket等待客戶端的連接,對於java的網絡程序來講,每一個客戶端都使用一個Socket對象表示。
socket通訊流程:
(1)創建Socket(客戶端) ServerSocket(服務端)
(2)客戶端/服務端打開並連接Socket的輸入/輸出流
(3)按照一定的規則進行讀/寫操作
(4)關閉Socket相關
- 簡述基於UDP的Socket編程的主要步驟。
提示:分別說明服務器端和客戶端的編程步驟。
實現流程:
服務器端(server):
1. 構造DatagramSocket實例,指定本地端口。
2. 通過DatagramSocket實例的receive方法接收DatagramPacket.DatagramPacket中間就包含了通信的內容。
3. 通過DatagramSocket的send和receive方法來收和發DatagramPacket.
客戶端(client):
1. 構造DatagramSocket實例。
2.通過DatagramSocket實例的send和receive方法發送DatagramPacket報文。
3.結束后,調用DatagramSocket的close方法關閉。
1 一、 編碼題 2 1. 使用基於TCP的Java Socket編程,完成如下功能: 3 1) 要求從客戶端錄入幾個字符,發送到服務器端。 4 2) 由服務器端將接收到的字符進行輸出。 5 3) 服務器端向客戶端發出“您的信息已收到”作為響應。 6 4) 客戶端接收服務器端的響應信息。 7 提示: 8 服務器端:PrintWriter out =new PrintWriter(socket.getOutputStream(),true); 9 客戶端:BufferedReader line=new BufferedReader(new InputStreamReader(System.in)); 10 11 public class clint_1 { 12 public static void main(String[] args) throws IOException { 13 //1.創建客戶端套接字 14 Socket s = new Socket("localhost",154); 15 //2.獲取輸出流(包裝)>字符緩沖流>字符轉換輸出流>字符輸出流 16 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 17 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 18 //3.寫入數據 19 Scanner sc = new Scanner(System.in); 20 System.out.println("請輸入發送信息:"); 21 bw.write(sc.nextLine()); 22 bw.flush(); 23 24 //4.通知服務器,客戶端數據寫入完畢 25 s.shutdownOutput(); 26 27 //5.從服務器獲得響應 28 String info = br.readLine(); 29 System.out.println(info); 30 s.close(); 31 } 32 } 33 public class Server_1 { 34 public static void main(String[] args) throws IOException { 35 //1.創建服務器端的套接字 36 ServerSocket ss = new ServerSocket(154); 37 //2.監聽客戶端的套接字 38 Socket s = ss.accept(); 39 //3.獲取輸入流,獲取輸出流 40 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 41 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 42 //4.讀取客戶端數據 43 System.out.println("--------------"); 44 String info = br.readLine(); 45 System.out.println(info); 46 47 //響應客戶端 48 bw.write("您的信息已收到"); 49 bw.flush(); 50 //關閉客戶端套接字 51 s.close(); 52 } 53 54 } 55 56 2. 使用基於UDP的Java Socket編程,完成在線咨詢功能: 57 1) 客戶向咨詢人員咨詢。 58 2) 咨詢人員給出回答。 59 3) 客戶和咨詢人員可以一直溝通,直到客戶發送bye給咨詢人員。 60 61 public static void main(String[] args){ 62 Scanner sc = new Scanner(System.in); 63 //創建套接字 64 DatagramSocket ds = null; 65 try { 66 ds = new DatagramSocket(); 67 while(true){ 68 System.out.println("請輸入發送的信息:"); 69 String info = sc.nextLine(); 70 byte[] buf ="".getBytes(); 71 DatagramPacket dp = new DatagramPacket 72 (buf, buf.length, InetAddress.getByName("localhost"), 124); 73 //發送數據 74 ds.send(dp); 75 if("bye".equals(info)){ 76 break; 77 } 78 } 79 } catch (IOException e) { 80 e.printStackTrace(); 81 }finally { 82 //創建數據包 83 ds.close(); 84 } 85 86 } 87 public class Server_2 { 88 public static void main(String[] args) throws IOException { 89 //創建套接字 90 DatagramSocket ds = new DatagramSocket(124); 91 //創建接受數據的空數據包 92 while(true){ 93 byte [] buf = new byte[1024]; 94 DatagramPacket dp = new DatagramPacket(buf, buf.length); 95 ds.receive(dp); 96 //拆分數據包 97 byte [] by2 =dp.getData(); 98 InetAddress address = dp.getAddress(); 99 String hostName = address.getHostName(); 100 //讀取數據 101 String info = new String(by2,0,by2.length); 102 System.out.println("來自*"+"@"+hostName+"*的消息是:"+info); 103 } 104 } 105 } 106 107 108 二、 可選題 109 1. 使用TCP網絡編程完成用戶登錄功能:客戶端輸入用戶名和密碼,向服務器發出登錄請求;服務器接收數據並進行判斷,如果用戶名和密碼均是bjsxt,則登錄成功,否則登錄失敗,返回相應響應信息;客戶端接收響應信息並輸出登錄結果。 110 1) 用戶User類已提供構造方法 public User(String username,String password)。 111 2) 客戶端采用ObjectOutputStream發送封裝了用戶名和密碼的User對象。 112 3) 服務器端和客戶端的類名和方法聲明如下所示。 113 import java.io.BufferedReader; 114 import java.io.BufferedWriter; 115 import java.io.IOException; 116 import java.io.InputStreamReader; 117 import java.io.OutputStreamWriter; 118 import java.net.Socket; 119 import java.util.Scanner; 120 public class clint { 121 public static void main(String[] args) throws IOException { 122 Socket s = new Socket("localhost", 110); 123 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 124 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 125 Scanner sc= new Scanner(System.in); 126 System.out.println("輸入用戶名:"); 127 String user = sc.nextLine(); 128 bw.write(user); 129 bw.flush(); 130 bw.newLine(); 131 System.out.println("輸入用戶密碼:"); 132 String password = sc.nextLine(); 133 bw.write(password); 134 bw.flush(); 135 136 s.shutdownOutput(); 137 138 String info = br.readLine(); 139 System.out.println(info); 140 141 s.close(); 142 } 143 } 144 145 import java.io.BufferedReader; 146 import java.io.BufferedWriter; 147 import java.io.FileInputStream; 148 import java.io.IOException; 149 import java.io.InputStreamReader; 150 import java.io.OutputStreamWriter; 151 import java.net.ServerSocket; 152 import java.net.Socket; 153 import java.util.HashMap; 154 import java.util.Map; 155 import java.util.Properties; 156 157 158 public class server { 159 public static Map<String, String> getinfo() throws IOException{ 160 Properties p = new Properties(); 161 p.load(new FileInputStream("User.properties")); 162 String user = p.getProperty("username"); 163 String pwd = p.getProperty("pwd"); 164 165 Map<String, String> map = new HashMap<>(); 166 map.put("username", user); 167 map.put("pwd", pwd); 168 return map; 169 } 170 171 public static void main(String[] args) throws IOException { 172 ServerSocket ss = new ServerSocket(110); 173 Socket s = ss.accept(); 174 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 175 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 176 String user = br.readLine(); 177 String pwd = br.readLine(); 178 179 Map<String, String> map = getinfo(); 180 if(map.get("username").equals(user)&&map.get("pwd").equals(pwd)){ 181 System.out.println("登錄成功!"); 182 bw.write("登錄成功!"); 183 bw.flush(); 184 }else{ 185 System.out.println("登錄失敗!"); 186 bw.write("登錄失敗"); 187 bw.flush(); 188 } 189 s.close(); 190 191 } 192 }
