15.计算机网络常用概念与课堂练习

15.计算机网络常用概念与课堂练习,第1张

作业
public class Client {
    /*
     * public static void main(String[] args) throws IOException {
        //创建客户端对象
        DatagramSocket ds = new DatagramSocket();
        
        //字符串
        String str = "i am client";
        
        //准备报文对象
        DatagramPacket dp =new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("192.168.54.2"), 8888);
        
        //客户端发送报文对象
        ds.send(dp);
        
        //关闭资源
        ds.close();
        
    }
     */
    
    public static void main(String[] args) throws IOException {
        //准备一个ip数组
        String[] ips = {"192.168.54.2","192.168.54.19","192.168.54.29"};
        
        //循环
        for (String ip : ips) {
            //调用send
            send(ip);
        }
    }
    
    //写个方法循环发送
    public static void send(String ip) throws IOException {
        //创建客户端对象
        DatagramSocket ds = new DatagramSocket();
        
        //字符串
        String str = "i am client 888";
        
        //准备报文对象
        DatagramPacket dp =new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName(ip), 8888);
        
        //客户端发送报文对象
        ds.send(dp);
        
        //关闭资源
        ds.close();
        
    }
}


/*
 * 利用TCP程序写一个聊天室,提示 服务端 
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        
        //创建服务端套接字对象
        ServerSocket ss = new ServerSocket(8888);
        
        //死循环
        while(true) {
            //接收客户端套接字对象
            Socket s = ss.accept();
            
            //获得输入流对象
            InputStream is = s.getInputStream();
            
            int len;
            byte[] b = new byte[1024];
            //循环写字符串
            while((len = is.read(b))>0) {
                System.out.println(new String(b,0,len));
            }
            
            //关闭客户端
            is.close();
            s.close();
        }
    }
}

上传

模拟,因为tcp编程做不到接收客户端自定义上传的文件,所以服务端这边写出去的文件也只能是写死的文件名。

逻辑:

1 客户端创建套接字对象,获取输入流(读取本地文件),获得输出流(向服务器上传)

/*
 * 上传方
 */
public class Client {
    public static void main(String[] args) throws IOException {
        /*
         客户端创建套接字对象,,获得输出流(向服务器上传)
         */
        Socket s = new Socket(InetAddress.getLocalHost(), 8888);
        
        //try ... with ...resource  在小括号定义流对象,这种写法不再需要,也无须担心finally释放资源忘记写
        try(InputStream is = new FileInputStream("C:\\work\\第一阶段\\20220228-20220304\\0228(网络编程)\\作业\\作业.txt");
            //套接字获得输出流
            OutputStream os = s.getOutputStream();  
            ) {
            
            //常规io *** 作
            int len;
            byte[] b = new byte[1024];
            //while循环
            while((len = is.read(b)) > 0) {
                //往服务器写
                os.write(b, 0, len);
            }
            
            //提示
            System.out.println("上传文件成功...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2 服务端创建服务端套按字,获取输入流对象,创建输出流对象(向机器写入文件)

public class Server {
    public static void main(String[] args) throws IOException {
        /*
          服务端创建服务端套按字,获取输入流对象,
         */
        ServerSocket ss = new ServerSocket(8888);
        
        //获得客户端套接字
        Socket s = ss.accept();
        
        try(
            //客户端获得输入流对象
            InputStream is = s.getInputStream();
            
            //创建输出流对象(向机器写入文件)
            OutputStream os = new FileOutputStream("C:\\Users\\粤嵌\\Desktop\\作业.txt");   
            ){
            
            //常规io *** 作
            int len;
            byte[] b = new byte[1024];
            
            //循环
            while((len = is.read(b)) >0) {
                os.write(b, 0, len);
            }
            
            System.out.println("保存成功...");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        //关闭资源
        s.close();
        ss.close();
    }
}

课堂练习:

客户端上传成功的消息是服务端通知的!要接收服务器响应的消息

public static void main(String[] args) throws IOException {
         //客户端创建套接字对象,,获得输出流(向服务器上传)
        Socket s = new Socket(InetAddress.getLocalHost(), 8888);
        
        //try ... with ...resource  在小括号定义流对象,这种写法不再需要,也无须担心finally释放资源忘记写
        try(InputStream is = new FileInputStream("C:\\work\\第一阶段\\20220228-20220304\\0228(网络编程)\\作业\\作业.txt");
            //套接字获得输出流
            OutputStream os = s.getOutputStream();  
            ) {
            
            //常规io *** 作
            int len;
            byte[] b = new byte[1024];
            //while循环
            while((len = is.read(b)) > 0) {
                //往服务器写
                os.write(b, 0, len);
            }
            
            //告诉服务器,客户端这边输出已经结束了,不写,两边的线程都会阻塞,无法结束
            s.shutdownOutput();
            
            //获取输入流
            InputStream s_is = s.getInputStream();
            int len2;
            //循环
            while((len2 = s_is.read(b)) > 0) {
                System.out.println(new String(b,0,len2));
            }
            
            s_is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

提示:客户端上传后,要关闭输出流对象(打标志),再通过客户端获得输入流对象(接收消息用)

public static void main(String[] args) throws IOException {
        /*服务端创建服务端套按字,获取输入流对象, */
        ServerSocket ss = new ServerSocket(8888);
        
        //获得客户端套接字
        Socket s = ss.accept();
        try(
            //客户端获得输入流对象
            InputStream is = s.getInputStream();
            
            //创建输出流对象(向机器写入文件)
            OutputStream os = new FileOutputStream("C:\\Users\\粤嵌\\Desktop\\作业2.txt");  
            ){
            
            //常规io *** 作
            int len;
            byte[] b = new byte[1024];
            
            //循环  //客户端写了一行s.shutdownOutput(); -1标志就有了
            while((len = is.read(b)) >0) {
                os.write(b, 0, len);
            }
            
            //往客户端发送消息
            OutputStream s_os = s.getOutputStream();
            s_os.write("文件上传成功".getBytes());
            
            s_os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        //关闭资源
        s.close();
        ss.close();
    }


TCP通信模型

 

课堂练习:

完成下载的代码编写

public class Client {
    public static void main(String[] args) throws IOException {
        //创建客户端套接字对象
        Socket s = new Socket(InetAddress.getLocalHost(), 8888);
        
        try(
            //获得客户端的输入流对象
            InputStream is = s.getInputStream();
            //创建输出流对象,保存    
            OutputStream os = new FileOutputStream("C:\\work\\第一阶段\\20220228-20220304\\0301(网络编程)\\不如跳舞.m4a")
                ){
            int len;
            byte[] b = new byte[1024];
            //循环
            while((len = is.read(b)) >0) {
                os.write(b, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //关闭资源
        s.close();
    }
}

public class Server {
    /*
     public static void main(String[] args) throws IOException {
        //创建服务端的套接字对象
        ServerSocket ss = new ServerSocket(8888);
        
        //while
        while(true) {
            //获得客户端
            Socket s = ss.accept();
            //客户端的输出流对象
            try(OutputStream os = s.getOutputStream();
                //读一个文件的输入流
                InputStream is = new FileInputStream("C:\\Users\\粤嵌\\Desktop\\123.m4a");
                ){
                //循环写出去
                int len;
                byte[] b = new byte[1024];
                
                while((len = is.read(b)) >0) {
                    os.write(b, 0, len);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
    }
     */
    public static void main(String[] args) throws IOException {
        //创建服务端的套接字对象
        ServerSocket ss = new ServerSocket(8888);
        
        //while
        while(true) {
            //获得客户端
            Socket s = ss.accept();
            //创建下载线程对象
            Download d = new Download(s);
            //借助Thread构造器
            Thread t = new Thread(d);
            //启动线程
            t.start();
        }
        
    }
}


public class Download implements Runnable{
    
    //Socket对象
    private Socket s;

    //对已有的对象进行增强,装饰者模式
    public Download(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        //客户端的输出流对象
        try(OutputStream os = s.getOutputStream();
            //读一个文件的输入流
            InputStream is = new FileInputStream("C:\\Users\\粤嵌\\Desktop\\123.m4a");
            ){
            //循环写出去
            int len;
            byte[] b = new byte[1024];
            
            while((len = is.read(b)) >0) {
                os.write(b, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

URL URL表示统一资源定位符,指向万维网上的“资源”的指针

我们日常生活中,给个链接,给个URL

访问某东:【N-ZONES7】NZONE S7 双5G全网通手机 5000mAh大电池 22.5W疾速快充 青山翠 6GB+128GB 双卡双待手机 华为智选【行情 报价 价格 评测】-京东

构造器:URL(String str) 构建一个URL对象

方法: openConnection()

URLDecoder

解码

 

URLEncoder

编码

 

public class DecoderAndEncoder {
    public static void main(String[] args) throws IOException {
        //字符串
        String s = "中国";
        //编码
        String encode = URLEncoder.encode(s, "utf-8");
        System.out.println("中国编码后:" + encode);
        System.out.println("ie浏览编码:%E4%B8%AD%E5%9B%BD");
        
        System.out.println("******************");
        
        //模拟后台对编码后的字符进行解码
        String s2 = "%E4%B8%AD%E5%9B%BD";
        //解码对象.解码(字符串,编码格式)
        String decode = URLDecoder.decode(s2, "utf-8");
        System.out.println("解码后:" + decode);
        
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/2990276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存