一、 填空题
- 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) 服务器端和客户端的类名和方法声明如下所示。
publicclass LoginServer { publicstaticvoid main(String[] args) throws Exception {} } publicclass LoginClient { publicstaticvoid 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 }