• 网络编程


    计算机网络

    网络中数据交流

    IP:

    Ipv4:

    32位,唯一标识计算机

    Ipv6:

    128

    端口号:

    唯一标识进程(软件)找到是程序

    package cn.jiedada.getip;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class InetTest {
    
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println(localHost);//DESKTOP-0H89I0E/172.16.9.175
            InetAddress[] allByName = InetAddress.getAllByName("DESKTOP-0H89I0E");
            for (InetAddress inetAddress : allByName) {
                System.out.println(inetAddress);
            }
            InetAddress name = InetAddress.getByName("baidu.com");
            System.out.println(name);
            InetAddress name2 = InetAddress.getByName("taobao.com");
            System.out.println(name2);
        }
    
    }

    URL

    IP+端口号+urs(什么文件夹下的什么文件)

    package cn.jiedada.url;
    
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.URL;
    
    public class UrlTest {
        public static void main(String[] args) throws Exception {
            /*获得豆瓣的网址
             * 获得一个输入流和一个输出流
             * 把输入byte数组存入流中
             * 通过int来存入字节大小
             * */
            URL url = new URL("http://www.douban.com");
            InputStream is = url.openStream();
            FileOutputStream fos = new FileOutputStream("F:\log\db.html");
            byte[] buff=new byte[1024*10];
            int len;
            while ((len=is.read(buff))!=-1) {
                fos.write(buff, 0, len);
            }
            fos.close();
            is.close();
            
        }
    
    }
    View Code

    TCP

    传输层层:数据传输的方式,可靠的,安全的,基于字节流的传输,如果超时没有收到消息就会再次发送连接,通常用于下载文件,等等需要完整的上传和下载的时候,缺点:速度慢

    UDP

    TCP一样的传输层,不可靠的,基于数据报的传输协议,不用建立连接

    速度块,不占用资源,用于QQ等这样的软件中

    Socket编程

    套接字编程主要为SOCKET客户机和server socket服务器两个套接字,通过服务器的对象.accpt()方法获得客户机和服务器的连接然后通过

    TCP编程

    三次握手:假设有2A,B

    A发送一次信息给BB收到后返回给AA收到后在发送给B,就能确定双方都收到了消息

    客户机

    package cn.jiedada.tcp;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    public class ClientTest {
        private Socket socket;
        public ClientTest() throws IOException {
            System.out.println("创建一个客户端");
                socket=new Socket("localhost", 8088);
        }
        public void start() throws IOException{
            //接收
            OutputStream os = socket.getOutputStream();
            //OutputStreamWriter osw = new OutputStreamWriter(os,"utf-8");
            PrintWriter pw = new PrintWriter(os, true);
            pw.println("你好呀");
            //接受消息
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            System.out.println(br.readLine());
            pw.close();
            os.close();
        }
        public static void main(String[] args) throws IOException {
            ClientTest ct = new ClientTest();
            ct.start();
        }
    }
    View Code

    服务器

    package cn.jiedada.tcp;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerTest {
        //创建服务器和端口号
        private ServerSocket serverSocket;
    
        public ServerTest() throws IOException {
            System.out.println("初始化服务器");
                serverSocket=new ServerSocket(8088);    
        }
        //因为涉及流的关闭所以在这里我们选择对异常进行抓取不抛出
        //想法二因为这里不需要打包为一个jar包所以这里最好用的方法是try(){}catch{}
        public void start() {
                //监听客户端并且阻塞该方法
                System.out.println("监听");
                Socket accept;
                InputStream is = null;
                InputStreamReader isr=null;
                BufferedReader br=null;
                OutputStream os=null;
                PrintWriter pw=null;
                try {
                    accept = serverSocket.accept();
                    System.out.println(accept.getInetAddress());
                    //获得流
                    is= accept.getInputStream();
                    /*一个inputstreamreader是桥从字节流字符流:将字节数组解码成文字使用指定的 charset。
                    字符集,它使用可指定名称或可给予明确,或平台的默认字符集可以接受。 
                    每次调用一个inputstreamreader的read()方法可能会导致一个或多个字节是从底层字节输入流中读取。
                    为了使字节的有效转换为字符,更多的字节可以从底层流读取,而不是满足当前读操作的必要。*/
                    isr = new InputStreamReader(is, "utf-8");
                    /*char[] cs=new char[1];
                    int len;
                    while ((len=isr.read(cs))!=-1) {
                        System.out.print(cs);
                    }*/
                    br = new BufferedReader(isr);
                    String rl = br.readLine();
                    System.out.println(rl);
                    //写回给客户端
                    os = accept.getOutputStream();
                    pw = new PrintWriter(os,true);
                    pw.println("收到");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    try {
                        is.close();
                        isr.close();
                        br.close();
                        os.close();
                        pw.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    };
                    
                }
                
        }
        public static void main(String[] args) throws IOException {
            ServerTest st = new ServerTest();
            st.start();
        }
        
    }
    View Code

    HTTP协议

    是应用层的协议解决包装问题

    分为请求文报和响应文报主要还是对psot请求的解决

    请求行

    请求头

    请求体

    TOMCAT模拟

    首先创建一个服务器,通过输入和输出流将文件读取出来,再通过HTTP协议将文件发布到浏览器中,通过输入IPPORT访问

    package cn.jiedada.tomcatsimulation;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**首先创建一个服务器
     * 把网站发布到服务器中
     * 然后通过服务器访问到。mthl文件
     * 怎么访问html呢,通过自己写入方法读取文件内容
     * input和output
     * 还必须通过HTTP协议才能把网站发布出去
     * @author 杰大大是真滴帅
     *
     */
    public class IpPortStartServerTest {
        private ServerSocket ss;
    
        public IpPortStartServerTest() {
            try {
                //初始化成功
                ss =new ServerSocket(8088);
                start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                try {
                    ss.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        public void start(){
            try {
                Socket accept = ss.accept();
                /*遇到的问题1这样读写有什么用呢?需要读入缓存区这样能提高速率
                 * 怎么把输入流和输出流串联起来呢,通过方法;(这是之前没有理解到的地方)
                 * */
                File file = new File("F:\JAVAEE\2019_08_16_HTML_CSS\WebContent\homework.html");
                FileInputStream fis = new FileInputStream(file);
                InputStreamReader isr = new InputStreamReader(fis,"utf-8");
                BufferedReader br = new BufferedReader(isr);
                
                OutputStream os = accept.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
                PrintWriter pw = new PrintWriter(osw, true);
                //读入和写出过后是先发布到http协议还是输入流和输出流串联起来
                //响应测试页面
                pw.println("http/1.1 200 OK");
                pw.println("Context-Type:text/html;charset=utf-8");
                pw.println("Context-Length"+file.length());
                pw.println();
                //需要要写这样才知道
                
                String s;
                while ((s=br.readLine())!=null) {
                    pw.write(s);
                }
                pw.close();
                os.close();
                br.close();
                isr.close();
                fis.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public static void main(String[] args) {
                new IpPortStartServerTest();
        }
    }
    View Code
  • 相关阅读:
    【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程
    modelsim使用常见问题及解决办法集锦③
    modelsim使用常见问题及解决办法集锦 ②
    KeepAlived双主模式高可用集群
    充分利用nginx的reload功能平滑的上架和更新业务
    nginx日志配置指令详解
    MongoDB 副本集
    MongoDB 备份还原
    MongoDB的搭建、参数
    mongoDB整个文件夹拷贝备份还原的坑
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/11370545.html
Copyright © 2020-2023  润新知