ruijiege

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

计算机网络

网络中数据交流

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

 

posted on 2019-08-17 21:55  哦哟这个怎么搞  阅读(201)  评论(0编辑  收藏  举报