网络编程作业及答案

网络编程作业

一、填空题

  1. 用来标志网络中的一个通信实体的地址。通信实体可以是计算机,路由器等。
    2.TCP的全称是
    __________________________。
    3.UDP的全称是________________________________________。
    4.统一资源定位符URL是指向互联网“资源”的指针,由4部分组成:协议、存放资源的主机域名、__________和资源路径和文件名。
  2.         是统一资源定位器的简称,它表示Internet上某一资源的地址。
    

6.在Socket编程中,IP地址用来标志一台计算机,但是一台计算机上可能提供多种应用程序,使用 来区分这些应用程序。
7.在Java Socket网络编程中,开发基于TCP协议的服务器端程序使用的套接字是 。
8.在Java Socket网络编程中,开发基于UDP协议的程序使用的套接字是 。

二、选择题

  1. 以下协议都属于TCP/IP协议栈,其中位于传输层的协议是( )。(选择二项)

    A TCP
    B. HTTP
    C. SMTP
    D. UDP

  2. 以下协议中属于TCP/IP协议栈中应用层协议的是( )。(选择一项)

    A HTTP
    B. TCP
    C. UDP
    D. IP

  3. 以下说法中关于UDP协议的说法正确的是( )。(选择二项)

    A. 发送不管对方是否准备好,接收方收到也不确认
    B. 面向连接
    C. 占用系统资源多、效率低
    D. 非常简单的协议,可以广播发送

  4. 在基于TCP网络通信模式中,客户与服务器程序的主要任务是( )。(选择二项)

    A 客户程序在网络上找到一条到达服务器的路由
    B. 客户程序发送请求,并接收服务器的响应
    C. 服务器程序接收并处理客户请求,然后向客户发送响应结果
    D. 如果客户程序和服务器都会保证发送的数据不会在传输途中丢失

  5. 在Java网络编程中,使用客户端套接字Socket创建对象时,需要指定( )。(选择一项)

    A 服务器主机名称和端口
    B. 服务器端口和文件
    C. 服务器名称和文件
    D. 服务器地址和文件

  6. ServerSocket的监听方法accept( )方法的返回值类型是( )。(选择一项)

    A. Socket
    B. void
    C. Object
    D. DatagramSocket

  7. Java UDP Socket编程主要用到的两个类是( )。(选择二项)

    A UDPSocket
    B. DatagramSocket
    C. UDPPacket
    D. DatagramPacket

  8. 在使用UDP套接字通信时,常用( )类把要发送的信息打包。(选择一项)

    A String
    B. DatagramSocket
    C. MulticastSocket
    D. DatagramPacket

三、判断题
1.Socket是传输层供给应用层的编程接口,是应用层与传输层之间的桥梁 。( )
2.TCP/IP传输控制协议是Internet的主要协议,定义了计算机和外设进行通信的规则。TCP/IP网络参考模型包括七个层次:应用层、会话层、表示层、传输层、网络层、链路层和物理层。( )
3.TCP协议一种面向连接的、可靠的、基于字节流的通信协议 。HTTP、FTP、TELNET、SMTP 都是基于TCP协议的应用层协议。( )
4.UDP协议是一种面向无连接的、可靠的、基于字节流的传输层通信协议,该协议占用系统资源多、效率较低。( )

四、简答题
1.IP的全称是? IP的作用是?
2.TCP/IP协议栈中,TCP协议和UDP协议的联系和区别?
3.通过类比打电话,详细描述三次握手机制。
4.为什么需要端口?端口是真实存在的还是虚拟的概念?
5.JAVA中,端口使用两个字节表示,可以表示多少端口? UDP和TCP端口是各自独立的吗?
6.InetAddress和InetSocketAddress都封装了哪些信息? 他们两的区别是?
7.简述基于TCP的Socket编程的主要步骤。
提示:分别说明服务器端和客户端的编程步骤。
8.简述基于UDP的Socket编程的主要步骤。
提示:分别说明服务器端和客户端的编程步骤。

五、编码题
1.编程实现:将网络上一张图片或一个mp3或一个视频的信息保存到本地。
提示:
URL url = new URL(“http://pic41.nipic.com/20140527/2131749_195511402164_2.jpg”);
InputStream is = url.openStream();
BufferedInputStream bis = new BufferedInputStream(is);
2.使用基于TCP的Java Socket编程,完成如下功能:
1)要求从客户端录入几个字符,发送到服务器端。
2)由服务器端将接收到的字符进行输出。
3)服务器端向客户端发出“您的信息已收到”作为响应。
4)客户端接收服务器端的响应信息。
提示:
服务器端:PrintWriter out =new PrintWriter(socket.getOutputStream(),true);
客户端:BufferedReader line=new BufferedReader(new InputStreamReader(System.in));
3.使用基于UDP的Java Socket编程,完成在线咨询功能:
1)客户向咨询人员咨询。
2)咨询人员给出回答。
3)客户和咨询人员可以一直沟通,直到客户发送bye给咨询人员。

六、可选题
1.使用TCP网络编程完成用户登录功能:客户端输入用户名和密码,向服务器发出登录请求;服务器接收数据并进行判断,如果用户名和密码均是glls,则登录成功,否则登录失败,返回相应响应信息;客户端接收响应信息并输出登录结果。
1)用户User类已提供构造方法 public User(String username,String password)。
2)客户端采用ObjectOutputStream发送封装了用户名和密码的User对象。
3)服务器端和客户端的类名和方法声明如下所示。

2.使用UDP的方式,完成对象的传递。

网络编程作业答案

一、填空题

1.IP地址
2.传输控制协议(Transfer Controln Protocol)
3.用户数据报协议(User Data Protocol)
4.端口
5.URL
6.端口
7.ServerSocket
8.DatagramSocket

二、选择题

1.AD
2.A
3.AD
4.BC
5.A
6.A
7.BD
8.D

三、判断题

1.√
2.×
3.√
4.×

四、简答题

答案略

五、编码题
1.编程实现:将网络上一张图片或一个mp3或一个视频的信息保存到本地。

public class Test {
	public static void main(String[] args) throws NoSuchMethodException, Exception {
		URL url = new 
			URL("http://pic41.nipic.com/20140527/2131749_195511402164_2.jpg");
		InputStream is = url.openStream();
		BufferedInputStream bis = new BufferedInputStream(is);
		// 保存到本地
		FileOutputStream fos = new FileOutputStream("c:/2.jpg");
		BufferedOutputStream bos = new BufferedOutputStream(fos);

		byte[] bs = new byte[10];
		int len = bis.read(bs);
		while (len != -1) {
			bos.write(bs, 0, len);
			len = bis.read(bs);
		}
		bos.flush();
		bis.close();
		bos.close();
	}
}

2.使用Java Socket编程,完成如下功能:
1)要求从客户端录入几个字符,发送到服务器端。
2)由服务器端将接收到的字符进行输出。
3)服务器端向客户端发出“您的信息已收到”作为响应。
4)客户端接收服务器端的响应信息。
服务器端:

public class Server { // 服务器端类
	private ServerSocket ss; // 声明ServerSocket对象
	private Socket socket; // 声明Socket对象
	private BufferedReader in; // 声明输入流对象BufferedReader
	private PrintWriter out; // 声明输出流对象
	public Server() {
		try {
			// 创建一个ServerSocket,指定等待端口
			ss = new ServerSocket(10000);
			while (true) {
				// 使用ServerSocket接收用户请求(处于监听状态)
				socket = ss.accept(); // 获得客户端的socket对象
				// 创建输入流并读取信息
				in = new BufferedReader(new InputStreamReader(socket
						.getInputStream()));
				String line = in.readLine();
				System.out.println("客户端说:" + line);
				// 创建输出流并输出信息
				out = new PrintWriter(socket.getOutputStream(), true);
				out.print("您的信息已接收!");
				// 关闭流和socket
				out.close();
				in.close();
				socket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
			out.println("出错了!");
		} // 创建ServerSocket对象
	}

	public static void main(String[] args) {// 程序主入口
		// 创建对象
		new Server();
	}
}
客户端:(3分)
public class Client { // 声明客户端类
	Socket socket; // 声明Socket对象
	BufferedReader in; // 声明输入流对象
	PrintWriter out; // 声明输出流对象
	public Client() { // 构造方法
		try {
			// 创建Socket对象,用来发送请求
			socket = new Socket(InetAddress.getLocalHost(), 10000);
			// 创建字符缓冲区对象
			BufferedReader line = new BufferedReader(new InputStreamReader(
					System.in));
			// 创建输出流对象并输出
			out = new PrintWriter(socket.getOutputStream(), true);
			out.println(line.readLine());
			// 创建输入流对象
			in = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			System.out.println(in.readLine());
			// 关闭流对象
			out.close();
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("出错了!");
		}
	}
	public static void main(String[] args) {
		// 创建对象
		new Client();
	}
}

3.使用基于UDP的Java Socket编程,完成在线咨询功能:
1)客户向咨询人员咨询。
2)咨询人员给出回答。
3)客户和咨询人员可以一直沟通,直到客户发送bye给咨询人员。

/**
 * 在线客服咨询人员
 */
public class AskServer {
	public static void main(String[] args) {
		//创建DatagramSocket,发送接收数据都依赖他
		DatagramSocket socket=null;
		try {
			socket = new DatagramSocket(8888);
			Scanner input = new Scanner(System.in);
			while(true){
				//准备一个空的数据包,用来接收数据
				byte [] buf = new byte[1024];
				DatagramPacket packet = new DatagramPacket(buf, buf.length);		
				//接收数据使用空的数据包
				socket.receive(packet);				
				//输出信息
				String info = new String(packet.getData(), 0, packet.getLength());
				System.out.println("客户端请求:"+info);
				//判断是否退出
				if("bye".equals(info)){
					break;
				}
				//发送数据
				String result =input.nextLine();
				byte[] buf2= result.getBytes();
				DatagramPacket packet2 = new DatagramPacket(buf2, buf2.length,
						packet.getAddress(), packet.getPort());
				socket.send(packet2);
			}			
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//关闭socket
			socket.close();
		}
	}
}
/**
 * 在线客服客户
*/
public class AskClient {
	public static void main(String[] args) {
		//创建DatagramSocket,发送接收数据都依赖他
		DatagramSocket socket=null;
		try {
			socket = new DatagramSocket(9999);
			Scanner input = new Scanner(System.in);
			while(true){
				//准备要发送的数据
				String str =input.nextLine();//bye
				//使用数据包把数据封装起来
				byte[] buf =str.getBytes();
				DatagramPacket packet = new DatagramPacket(buf, buf.length, 
						InetAddress.getByName("192.168.1.252"), 8888);
				//发送数据包
				socket.send(packet);
				//判断是否退出
				if("bye".equals(str)){
					break;
				}
				//接收数据
				byte [] buf2 = new byte[1024];
				DatagramPacket packet2 = new DatagramPacket(buf2, buf2.length);
				socket.receive(packet2);
				System.out.println("服务器端反馈:"+
new String(packet2.getData(),0,packet2.getLength()));
			}			
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//关闭socket
			socket.close();
		}		
	}
}

六、可选题
1.使用TCP网络编程完成用户登录功能:客户端输入用户名和密码,向服务器发出登录请求;服务器接收数据并进行判断,如果用户名和密码均是glls,则登录成功,否则登录失败,返回相应响应信息;客户端接收响应信息并输出登录结果。
1)用户User类已提供构造方法 public User(String username,String password)。
2)客户端采用ObjectOutputStream发送封装了用户名和密码的User对象。
3)服务器端和客户端的类名和方法声明如下所示。

public class LoginServer {
	public static void main(String[] args) throws Exception {
		// 1.创建一个ServerSocket,指定等待端口(1分)
		ServerSocket serverSocket = new ServerSocket(8888);
		// 2.使用ServerSocket接收用户请求(处于监听状态)(1分)
		Socket socket =  serverSocket.accept();
		// 3.创建输入流和输出流(0.5分)
		ObjectInputStream ois = 
new ObjectInputStream(socket.getInputStream());
		DataOutputStream dos = 
new DataOutputStream(socket.getOutputStream());
		// 4.接收用户数据并输出(0.5分)
		User user = (User) ois.readObject();
		System.out.println("我是服务器,收到的信息是:" + user);
		// 5.发送反馈信息(0.5分)
		boolean flag = false;
		if ("glls".equals(user.getUsername())
				&& "glls".equals(user.getPassword())) {
			flag = true;
		}
		dos.writeBoolean(flag);
		// 6.关闭流和socket(0.5分)
		ois.close();		
dos.close();		
socket.close();
	}
}

public class LoginClient {
	public static void main(String[] args) throws Exception {
		// 1.创建Socket,用来发送请求(0.5分)
		Socket socket = 
new Socket(InetAddress.getByName("127.0.0.1"), 8888);
		// 2.创建输入流和输出流(0.5分)
		DataInputStream dis =
				new DataInputStream(socket.getInputStream());
		ObjectOutputStream oos =  
			new ObjectOutputStream(socket.getOutputStream());
		// 3.发送数据(1分)
		Scanner input = new Scanner(System.in);
		System.out.println("请输入用户名");
		String username = input.nextLine();
		System.out.println("请输入密码");
		String password = input.nextLine();
		User user = new User(username, password);
		oos.writeObject(user);
		// 4.接收反馈信息并输出(0.5分)
		boolean flag = dis.readBoolean();
		if (flag) {
			System.out.println("登录成功");
		} else {
			System.out.println("登录失败");
		}
		// 5.关闭流和socket(0.5分)
		dis.close();		
oos.close();		
socket.close();
	}
}
  1. 使用UDP的方式,完成对象的传递。
public class UdpClient {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DatagramSocket ds = null;
		try {
			ds = new DatagramSocket(9999);
			//创建一个发送数据的对象 相当于邮递员
			//端口号是发送端口号,可以使用系统提供的,自己不指定端口号。
			User user = new User("小刚", "123456");
			//自带缓冲区的字节数组用来缓存接收写入的数据 以字节数组的形式保存
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			//使用对象流进行包装,方便写入对象
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			//写出对象,到缓冲区
			oos.writeObject(user);
			//将缓冲区的数据转换成字节数组
			byte[] buf = baos.toByteArray();
			//创建数据包  相当于信件
			DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 8888);
			ds.send(dp);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(ds != null){
				ds.close();
			}
		}

	}

}


public class UdpServer {

	public static void main(String[] args) {
		DatagramSocket ds = null;
		try {
			ds = new DatagramSocket(8888);
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf, buf.length);
				//阻塞
				ds.receive(dp);
				byte[] temp = dp.getData();
				ByteArrayInputStream bais = new ByteArrayInputStream(temp);
				ObjectInputStream ois = new ObjectInputStream(bais);
				
				User user = (User)ois.readObject();
				
//				String s = new String(temp , 0 , dp.getLength());
				System.out.println("接受到客户端的数据:"+ user);
				
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(ds != null){
				ds.close();
			}
		}
	}

}


public class User implements Serializable{
	
	private static final long serialVersionUID = 1L;
	private String name;
	private String password;
	
	public User() {
	}
	public User(String name, String password) {
		super();
		this.name = name;
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", password=" + password + "]";
	}

}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值