网络编程作业
一、 填空题
- ______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 }