Java网络通信应用实验

138 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

写在前面:

本文完成的业务功能或场景均为自己根据实验要求的第一点与第二点编撰的。本文给出了我编撰的两个场景,给出了实现代码、实验过程、结果分析以及一些思考题和解答,对于本次的实验报告,本文仅供参考,具体还得依据各位自己所创造的背景来完成。

要求:

1.通过URL访问网络资源方法,掌握通过URL类和URLConnection类获得指定网络资源内容和文件属性,理解文件和流的概念,理解流在获得文件内容中的作用。 2. 理解Socket通信原理,掌握使用ServerSocket类和socket类进行Tcp socket通信的程序设计方法。 3.业务功能或场景由学员自已选择: (要在此处写明完成的功能和业务场景) ①:小明同学想要下载百度官网的html文件和腾讯图标的png文件。要求通过URL访问网络资源方法,掌握通过URL类和URLConnection类获得指定网络资源内容和文件属性,理解文件和流的概念,理解流在获得文件内容中的作用。要求编写程序帮助该同学下载百度官网的html文件和腾讯图标的png文件,下载在指定的位置并设置保存的名称,显示相关属性。 ②:小明同学加入了学校的某个大群,这个大群里的两位同学跟他打招呼表示欢迎。要求理解Socket通信原理,掌握使用ServerSocket类和socket类进行Tcp socket通信的程序设计方法。要求模拟此场景,运用相关知识编写一个程序实现多人聊天功能,要显示客户的加入,显示每个客户所输入的对话内容。

实现代码:

①:

 package com.zhangyufan.net;
 ​
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.Scanner;
 ​
 public class Download {
     URL url;
 ​
     public void setURL(String u) throws Exception {
         url = new URL(u);
     }
 ​
     Download(String u) throws Exception {
         url = new URL(u);
     }
 ​
     Download() {
 ​
     }
 ​
     public void downloadResources(String savePath, String fileName) throws Exception {
         URLConnection urlConnection = url.openConnection();
         urlConnection.connect();
         String contentType = urlConnection.getContentType();
         String[] s = contentType.split("/");
         int contentLength = urlConnection.getContentLength();
         long date = urlConnection.getDate();
         long lastModified = urlConnection.getLastModified();
         System.out.println("下载了."+s[1]+"类型文件");
         System.out.println("内容大小为:"+contentLength);
         System.out.println("该URL响应头的日期信息为:"+date);
         System.out.println("文件的最后修改日期为:"+lastModified);
         InputStream is = urlConnection.getInputStream();
         FileOutputStream fos = new FileOutputStream(savePath + fileName + "." + s[1]);
         byte[] b = new byte[1024];
         int len;
         while ((len = is.read(b)) != -1) {
             fos.write(b, 0, len);
         }
         fos.close();
     }
     public static void main(String[] args) throws Exception {
         // 这个是我在自己电脑上随便找的一个保存路径,具体的保存路径需要各位自行在电脑上选择
         String savePath = "C:\Users\Spiderman\IdeaProjects\小明Projects\src\小明的资源";
         String url, fileName;
         Download dl = new Download();
         Scanner sc = new Scanner(System.in);
         while (true) {
             System.out.println("请输入想要下载资源的地址和想要保存的文件名(用空格分隔):");
             url = sc.next();
             fileName = sc.next();
             dl.setURL(url);
             dl.downloadResources(savePath, fileName);
         }
     }
 }

②:

 // 服务器端
 package com.zhangyufan.net;
 ​
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.List;
 import java.util.Vector;
 ​
 public class Server {
     protected static List<Socket> sockets = new Vector<>();
     public static void main(String[] args) throws IOException {
         ServerSocket ss = new ServerSocket(6666);
         boolean flag = true;
         while (flag) {
             try {
                 Socket accept = ss.accept();
                 synchronized (sockets) {
                     sockets.add(accept);
                 }
                 Thread thread = new Thread(new ServerThead(accept));
                 thread.start();
             } catch (Exception e) {
                 flag = false;
                 e.printStackTrace();
             }
         }
         ss.close();
     }
 ​
 }
 class ServerThead extends Server implements Runnable {
     Socket socket;
     String socketName;
     public ServerThead(Socket socket) {
         this.socket = socket;
     }
 ​
     @Override
     public void run() {
         try {
             BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             socketName = socket.getRemoteSocketAddress().toString();
             System.out.println("Client@" + socketName + "已加入聊天");
             forwardMessage("Client@" + socketName + "已加入聊天");
             boolean flag = true;
             while (flag) {
                 String str = br.readLine();
                 if (str == null) {
                     flag = false;
                     continue;
                 }
                 String s = "Client@" + socketName + ":" + str;
                 System.out.println(s);
                 forwardMessage(s);
             }
 ​
             closeConnect();
         } catch (IOException e) {
             try {
                 closeConnect();
             } catch (IOException e1) {
                 e1.printStackTrace();
             }
         }
     }
 ​
     private void forwardMessage(String str) throws IOException {
         PrintWriter pw = null;
         synchronized (sockets) {
             for (Socket s : sockets) {
                 pw = new PrintWriter(s.getOutputStream());
                 pw.println(str);
                 pw.flush();
             }
         }
     }
 ​
     public void closeConnect() throws IOException {
         System.out.println("Client@" + socketName + "已退出聊天");
         forwardMessage("Client@" + socketName + "已退出聊天");
         synchronized (sockets) {
             sockets.remove(socket);
         }
         socket.close();
     }
 }
 // 客户端
 package com.zhangyufan.net;
 ​
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.net.Socket;
 ​
 public class  Client{
 ​
     public static void main(String[] args) throws IOException {
         Socket socket = new Socket("localhost",6666);
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         PrintWriter pw = new PrintWriter(socket.getOutputStream());
         BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
         new Thread(new Runnable() {
             @Override
             public void run() {
                 try {
                     while (true){
                         System.out.println(br.readLine());
                     }
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }).start();
         String  str = reader.readLine();
         while (!"end".equalsIgnoreCase(str)){
             pw.println(str);
             pw.flush();
             str = reader.readLine();
         }
         pw.close();
         br.close();
         socket.close();
     }
 }

实验过程:

①: 1.输入百度官网网址:www.baidu.com/,输入想要保存的文件名:小明下载的百度官网的html文件,然后就会显示相关属性。同理,输入腾讯图标的网址:www.tencent.com/img/index/t…,输入想要保存的文件名:小明下载的腾讯图标的png文件,然后就会显示相关属性。 在这里插入图片描述 2.进入保存下载资源的文件夹,发现下载的资源都存在于应该在的位置。 在这里插入图片描述 3.打开第一个小明下载的百度官网的html文件,正常打开。打开第二个小明下载的腾讯图标的png文件,正常打开。 在这里插入图片描述 在这里插入图片描述 ②: 1.先运行服务器端,然后连续运行三次客户端,加入三个聊天的客户。运行终端里显示一个服务器端和三个客户端。

在这里插入图片描述

2.第一个客户端输入:大家好,我是小明。第二个客户端输入:欢迎新人!第三个客户端输入:欢迎欢迎!服务器端显示了此三人的聊天内容。

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

结果分析:

①: 实验结果:在实验过程中已贴出,此处不再展示。 分析:该程序通过输入百度官网的网址和腾讯图标的网址,成功下载了百度官网的html文件和腾讯图标的png文件到指定的位置,并且设置了保存的名称,显示了文件类型,内容大小,URL响应头的日期信息和文件的最后修改日期这些相关属性。在指定的下载位置中也确实有下载下来的这两个文件,并且都能够正常打开。该程序实现了通过URL访问网络资源方法,通过该实验,掌握了如何通过URL类和URLConnection类获得指定网络资源内容和文件属性,理解了文件和流的概念,理解了流在获得文件内容中的作用,程序整体无语法错误或逻辑错误。

②: 实验结果:在实验过程中已贴出,此处不再展示。 分析:该程序模拟实现了“小明同学加入了学校的某个大群,这个大群里的两位同学跟他打招呼表示欢迎。”这一场景,允许同时运行多个客户端,允许每个客户端发送信息给别的客户端。服务器端能够处理来自多个客户端的请求,向在线的客户端转发消息。通过该实验,理解了Socket通信原理,掌握了如何使用ServerSocket类和socket类进行Tcp socket通信的程序设计方法。程序整体无语法错误或逻辑错误。

思考题:

1.TCP和UDP的主要区别是什么?

答:TCP是基于连接的,而UDP是基于无连接的;TCP是可靠传输,使用流量控制和拥塞控制,而UDP是不可靠传输,不使用流量控制和拥塞控制;TCP只能是一对一通信,而UDP支持一对一,一对多,多对一和多对多交互通信;TCP是面向字节流的传输方式,而UDP是面向报文的传输方式;TCP的首部开销最小20字节,最大60字节,而UDP的首部开销小,仅8字节;TCP适用于要求可靠传输的应用,例如文件传输,而UDP适用于实时应用(IP电话、视频会议、直播等)。

2.qq使用的是什么协议?

答:qq以UDP协议为主,以TCP协议为辅。

3.列出至少5种应用的端口号?

答: 1、ftp:文件传输协议。常用端口号为20、21。20用于连接,21用于传输。 2、ssh:安全外壳协议。常用端口号为22。专为远程登录会话和其他网络服务提供安全性的协议。 3、http:超文本传输协议。常用端口号为80。用于网页浏览。 4、DNS:域名系统。常用端口号为53。用于域名解析。 5、https:超文本传输安全协议。常用端口号为443。用于安全浏览网页。 6、www代理服务:Apache Tomcat web服务器。常用端口号为8080。用于进行网页浏览。 7、smtp:简单邮件传输协议。常用端口号为25。 8、telnet:不安全的文本传送。常用端口号为23。 9、pop3:邮局协议。常用端口号为110。